正在将代码段从C++转换为C#

本文关键字:C++ 转换 代码 | 更新日期: 2023-09-27 18:25:13

我正试图将这段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)或完全不同的东西?

正在将代码段从C++转换为C#

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

应该起作用。通常,不计算为布尔值的C++条件与0进行隐式比较,"true"表示表达式不是0。

实际上,十六进制数字0x8、0x4、0x2、0x1是二进制的1000010000100001。你的代码中使用的方式让我想起了口罩。它们的唯一目的是"关闭"原始字节的所有位,除了"打开"的位。例如:

如果"锁存状态==0x1",则只有第一个条件为真。

在你提供的两个答案中,我认为第二个是对的。您需要得到的数字不为0。然而,if语句不是这样做的吗?

我希望这能帮助…:D

要在不重新排序if块的情况下直接转换,您可以使用第二个选项:

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

如果设置了该位,则结果将为非零,其计算结果为逻辑真值。所以你想测试结果是否为零。以上内容相当于C或C++中的此语句:

if (latch_state & 0x1)

顺便说一下,根据你所说的其他内容,将任何8位无符号整数视为"字节"是很正常的。因此,不要担心可能发生的任何"转换"。这是一样的事情。