-2

基本上,我有这个控制器,我正在读取数据,当你按下 1 按钮时,它向计算机输出 8,当你按下 2 时,它输出 16,当你按下 3 时,它输出一个32,当你按下4时,它输出一个64,当你按下5时,它输出一个128,当你按下6时,它输出一个256对吧?好吧,这就是它变得有趣的时候。当你按下,比如说1和2按钮,它输出一个24,如果你按下3和1,它输出40!它将所有按钮加在一起!有没有什么办法可以写出另一部分代码来分离出来,让它说出正在按下哪些按钮来获得这个总和?我在想我可以为所有组合想出一个 if 语句,但每个控制器有 36 个 if 语句,我一次使用两个。请帮忙!

阴影

编辑:我的代码很简单;我正在使用预先构建的 SDK,所以我仍在努力挖掘其中的所有内容。我发现我可以打印这个称为“按钮”的 int,这就是我正在谈论的一个变量。这是代码(至少是我需要帮助破译的部分):

cout << acd.controllers[0].buttons << endl;

我对 C++ 还比较陌生(我也知道基础知识和一些中间的东西),我正在努力解决所有问题,但我在 Google 中找不到任何可以帮助我解决这个问题的东西。

@Angew:你在说什么手柄?@Peter:我是这么认为的,我只是不知道该怎么做。

4

2 回答 2

3

你在找这个吗?

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 循环(如果可用)或迭代器。

于 2013-06-18T14:17:57.613 回答
0

要从已按位或一起的位中获取数据,您需要使用按位与:

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
于 2013-06-18T14:30:18.463 回答