В основном, у меня есть этот контроллер, с которого я читаю данные, и когда вы нажимаете кнопку 1, он выводит 8 на компьютер, когда вы нажимаете 2, он выводит 16, когда вы нажимаете 3, он выводит 32, когда вы нажимаете 4, он выдает 64, когда вы нажимаете 5, он выдает 128, а когда вы нажимаете 6, выдает 256, верно? Ну, вот когда это становится интересным. Когда вы нажимаете, скажем, кнопки 1 и 2 вместе, выдается 24, если вы нажимаете 3 и 1, выдает 40! Он добавляет все кнопки вместе! Есть ли способ, которым я мог бы написать другую часть кода, которая будет выделяться и сказать, какие кнопки нажимаются, чтобы получить эту сумму? Я думал, что мог бы просто создать оператор if для всех комбинаций, но это 36 операторов if на контроллер, и я использую два оператора за раз. Пожалуйста помоги!
Тень
Редактировать:
Ну, мой код довольно прост; Я использую предварительно созданный SDK, поэтому я все еще пытаюсь уничтожить все, что есть в нем. Я понял, что могу напечатать этот int, называемый «кнопками», и это единственная переменная, о которой я говорю. Вот код (по крайней мере, та часть, которая мне нужна для расшифровки):
соиЬ << acd.controllers [0] .buttons << епсИ;
Я все еще относительно новичок (я знаю основы и некоторые промежуточные вещи) для C ++ и пытаюсь все выяснить, и я не смог найти в Google ничего, что могло бы помочь мне с этой проблемой.
@Angew: О какой ручке ты говоришь?
@Peter: Я так и думал, я просто понятия не имею, как это сделать.
Вы ищете это?
for (size_t bit = 3; bit <= 8; ++bit)
{
if (output & (1 << bit))
{
handle_case_that_button_was_pressed(bit - 2);
}
}
куда output
это выход из контроллера, и handle_case_that_button_was_pressed(n)
это местозаполнитель для вашего кода, касающийся того факта, что кнопка nr. n
был нажат.
РЕДАКТИРОВАТЬ
Пример для вывода всех нажатых кнопок:
std::vector<size_t> buttonsPressed;
for (size_t bit = 3; bit <= 8; ++bit)
{
if (output & (1 << bit))
{
buttonsPressed.push_back(bit - 2);
}
}
if (buttonsPressed.empty())
std::cout << "No buttons pressed\n";
else {
std::cout << "Button";
if (buttonsPressed.size() > 1)
std::cout << 's';
std::cout << ' ';
for (size_t idx = 0; idx < buttonsPressed.size(); ++idx) {
std::cout << buttonsPressed[idx] << ", "}
std::cout << "are pressed.\n";
}
Для быстрой демонстрации я использовал индексирование для обхода вектора. Это не то, как вы обычно это делаете — вы используете цикл for, если он доступен, на основе диапазона, или итераторы.
Чтобы получить данные из битов, которые были побитовые или объединены вместе, вам нужно использовать побитовое И:
int ONE = 8;
int TWO = 16;
int THREE = 32;
int FOUR = 64;
int pressed = ONE | THREE; // pressed is now 40
if(pressed & ONE) {
// handle 1 is pressed
}
if(pressed & TWO) {
// handle 2 is pressed
}
// etc