我试图将这段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)
或完全不同的东西?
答案 0 :(得分:7)
if ((latch_state & 0x1) != 0)
应该有效。通常,不评估为布尔值的C ++条件与0进行隐式比较,“true”表示表达式不为0。
答案 1 :(得分:1)
实际上,十六进制数0x8,0x4,0x2,0x1是二进制的1000,0100,0010,0001。在代码中使用的方式让我想起了面具。它们唯一的目的是“关闭”原始字节的所有位,除了它们“打开”的位。例如:
如果`latch state == 0x1',那么只有第一个条件才为真。
在您提供的两个答案之间,我认为第二个答案是正确的。你需要得到的数字不是0.但是,这不是if语句的作用吗?
我希望这有助于......:D
答案 2 :(得分:1)
要直接转换而不重新排序if-blocks,您可以使用第二个选项:
if ((latch_state & 0x1) != 0x0)
如果该位置位,则结果将为非零,其结果为逻辑真值。所以你想测试结果不是零。以上内容相当于C或C ++中的这个陈述:
if (latch_state & 0x1)
顺便说一句,接下来你说的其他事情,将任何8位无符号整数视为'字节'是很正常的。所以不要担心可能发生的任何“转换”。这是一回事。