Преобразование сегмента кода из C ++ в C #

Я пытаюсь преобразовать этот сегмент кода 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) так что они не являются проблемой, но я не понимаю, какие заявления будут.

latch_state имеет тип uint8_t, но кажется, что он обрабатывается как байт (именно это я и пытался преобразовать) и 0x1 также представляется байтом.

Итак, как будет оцениваться двоичный файл и операция в операторе if?

Для преобразования, я должен сделать

if ((latch_state & 0x1) == 0x0) или же if ((latch_state & 0x1) != 0x0) или что-то совершенно другое?

0

Решение

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

должно сработать. Обычно условия C ++, которые не оцениваются как логические, делают неявное сравнение с 0, при этом «true» означает, что выражение не равно 0.

7

Другие решения

На самом деле шестнадцатеричные числа 0x8, 0x4, 0x2, 0x1 — это 1000, 0100, 0010, 0001 в двоичном виде. То, как они используются в вашем коде, напоминает мне маски. Их единственная цель — «выключить» все биты исходного байта, кроме того, который у них есть «вкл». Например:

Если `latch state == 0x1 ‘, то будет выполнено только первое условие.

Между двумя ответами, которые вы предоставили, я считаю, что второй является правильным. Вам нужно, чтобы результирующее число не было 0. Однако разве это не то, что делает оператор if в любом случае?

Я надеюсь, что это помогает …: D

1

Чтобы напрямую конвертировать без изменения порядка блоков if, вы должны использовать второй вариант:

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

Если бит установлен, результат будет ненулевым, что соответствует логической истине. Итак, вы хотите проверить, что результат не равен нулю. Вышесказанное эквивалентно этому утверждению в C или C ++:

if (latch_state & 0x1)

Кстати, учитывая сказанное вами, вполне нормально думать о любом 8-битном целом без знака как о «байте». Поэтому не беспокойтесь ни о каком «обращении», которое может иметь место. Это то же самое.

1
По вопросам рекламы [email protected]