-2

基本的に、私はデータを読み取るコントローラーを持っています。1 ボタンを押すとコンピューターに 8 が出力され、2 を押すと 16 が出力され、3 を押すとコンピューターに出力されます。 32、4 を押すと 64 が出力され、5 を押すと 128 が出力され、6 を押すと 256 が出力されますよね?さて、ここからが面白くなります。1 と 2 のボタンを一緒に押すと 24 が出力され、3 と 1 を押すと 40 が出力されます。すべてのボタンを一緒に追加しています。コードの別の部分を記述して、この合計を作るためにどのボタンが押されているかを示す方法はありますか? すべてのコンボに対して if ステートメントを考え出すことができると考えていましたが、それはコントローラーごとに 36 の if ステートメントであり、一度に 2 つ使用しています。助けてください!

編集:私のコードは非常に単純です。私はビルド済みの SDK を使用しているので、そこにあるすべてのものを明らかにするのにまだ苦労しています。「ボタン」と呼ばれるこの int を出力できることがわかりました。これが、私が話している変数の 1 つです。これがコードです(少なくとも、解読するのに助けが必要な部分です):

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

ビットごとに OR されたビットからデータを取得するには、ビットごとの AND を使用する必要があります。

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 に答える