Я пытаюсь преобразовать этот сегмент кода 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)
или что-то совершенно другое?
if ((latch_state & 0x1) != 0)
должно сработать. Обычно условия C ++, которые не оцениваются как логические, делают неявное сравнение с 0, при этом «true» означает, что выражение не равно 0.
На самом деле шестнадцатеричные числа 0x8, 0x4, 0x2, 0x1 — это 1000, 0100, 0010, 0001 в двоичном виде. То, как они используются в вашем коде, напоминает мне маски. Их единственная цель — «выключить» все биты исходного байта, кроме того, который у них есть «вкл». Например:
Если `latch state == 0x1 ‘, то будет выполнено только первое условие.
Между двумя ответами, которые вы предоставили, я считаю, что второй является правильным. Вам нужно, чтобы результирующее число не было 0. Однако разве это не то, что делает оператор if в любом случае?
Я надеюсь, что это помогает …: D
Чтобы напрямую конвертировать без изменения порядка блоков if, вы должны использовать второй вариант:
if ((latch_state & 0x1) != 0x0)
Если бит установлен, результат будет ненулевым, что соответствует логической истине. Итак, вы хотите проверить, что результат не равен нулю. Вышесказанное эквивалентно этому утверждению в C или C ++:
if (latch_state & 0x1)
Кстати, учитывая сказанное вами, вполне нормально думать о любом 8-битном целом без знака как о «байте». Поэтому не беспокойтесь ни о каком «обращении», которое может иметь место. Это то же самое.