正在将代码段从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)
或完全不同的东西?
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位无符号整数视为"字节"是很正常的。因此,不要担心可能发生的任何"转换"。这是一样的事情。