0

この C++ コードのセグメントを C# に変換しようとしています。

  if (latch_state & 0x1) {
    MC->setPin(AIN2pin, HIGH);
  } else {
    MC->setPin(AIN2pin, LOW);
  }

  if (latch_state & 0x2) {
    MC->setPin(BIN1pin, HIGH);
  } else {
    MC->setPin(BIN1pin, LOW);
  }

  if (latch_state & 0x4) {
    MC->setPin(AIN1pin, HIGH);
  } else {
    MC->setPin(AIN1pin, LOW);
  }

  if (latch_state & 0x8) {
    MC->setPin(BIN2pin, HIGH);
  } else {
    MC->setPin(BIN2pin, LOW);
  }

問題にならないように変換するのに十分な知識MC->setPin(PinNum, state)MC.setPin(pinNum, state)ありますが、ifステートメントがどうなるかについて混乱しています。

latch_stateはタイプuint8_tですが、バイトのように処理されているようで(これは私が変換しようとしていたものです)0x1、バイトのようにも見えます。

では、バイナリと演算は if ステートメントでどのように評価されるのでしょうか?

変換のために、私はするべきですか

if ((latch_state & 0x1) == 0x0)それともif ((latch_state & 0x1) != 0x0)まったく違うものですか?

4

3 に答える 3

7
if ((latch_state & 0x1) != 0)

動作するはずです。通常、ブール値に評価されない C++ 条件は、式が 0 でないことを「true」として、0 との暗黙的な比較を行っています。

于 2013-07-29T02:49:55.943 に答える
1

実際には、16 進数の 0x8、0x4、0x2、0x1 は、2 進数で 1000、0100、0010、0001 です。あなたのコードで使用されている方法は、マスクを思い出させます。それらの唯一の目的は、「オン」になっているビットを除く元のバイトのすべてのビットを「オフ」にすることです。例えば:

「latch state == 0x1」の場合、最初の条件のみが真になります。

あなたが提供した2つの答えのうち、2番目の答えが正しいと思います。結果の数値が 0 にならないようにする必要があります。

これが役立つことを願っています... :D

于 2013-07-29T02:50:00.777 に答える
1

if ブロックを並べ替えずに直接変換するには、2 番目のオプションを使用します。

if ((latch_state & 0x1) != 0x0)

ビットが設定されている場合、結果は非ゼロになり、論理的真に評価されます。したがって、結果がゼロでないことをテストします。上記は、C または C++ の次のステートメントと同等です。

if (latch_state & 0x1)

ちなみに、あなたが言った他のことを拾うと、8ビットの符号なし整数を「バイト」と考えるのはごく普通のことです。したがって、「変換」が行われている可能性について心配する必要はありません。それは同じことです。

于 2013-07-29T02:53:57.720 に答える