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

时间:2013-07-29 02:39:25

标签: c# c++ .net-micro-framework

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

3 个答案:

答案 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位无符号整数视为'字节'是很正常的。所以不要担心可能发生的任何“转换”。这是一回事。