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是 type 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

实际上十六进制数 0x8, 0x4, 0x2, 0x1 是二进制的 1000, 0100, 0010, 0001。你的代码中使用的方式让我想起了面具。他们唯一的目的是“关闭”原始字节的所有位,除了他们“打开”的那个。例如:

如果'latch state == 0x1',那么只有第一个条件为真。

在您提供的两个答案之间,我认为第二个答案是正确的。您需要得到的数字不为 0。但是,这不就是 if 语句的作用吗?

我希望这会有所帮助...:D

于 2013-07-29T02:50:00.777 回答
1

要直接转换而不重新排序 if 块,您将使用第二个选项:

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

如果设置了该位,则结果将非零,其计算结果为逻辑真理。所以你想测试结果不为零。以上等价于 C 或 C++ 中的这条语句:

if (latch_state & 0x1)

顺便说一句,接听您所说的其他内容,将任何 8 位无符号整数视为“字节”是很正常的。所以不要担心可能发生的任何“转换”。这是同一件事。

于 2013-07-29T02:53:57.720 回答