Побитовый оператор в вопросе кода Arduino
Что делает приведенный ниже код Arduino?
Я не знаком со знаком "+" в отношении побитовых операций. Просто знакомлюсь с этим материалом.
return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
@fmarquet, 👍1
Обсуждение2 ответа
+
— это оператор сложения. Он используется для добавления чисел. Например,
2+3
дает 5.
Для анализа вашего выражения назовем биты "a", "b", "c" и "d".
из одного
, двух
, трех
и четырех
соответственно, вот так:
one = aaaaaaaa
two = bbbbbbbb
three = cccccccc
four = dddddddd
Эти числа могут иметь длину более 8 бит, но в этом случае дополнительные биты
будут отброшены операциями &
. Теперь вычислим условия
сумма, а затем вся сумма:
(one << 24) & 0xFFFFFFFF = aaaaaaaa000000000000000000000000
(two << 16) & 0x00FFFFFF = 00000000bbbbbbbb0000000000000000
(three << 8) & 0x0000FFFF = 0000000000000000cccccccc00000000
(four << 0) & 0x000000FF = 000000000000000000000000dddddddd
─────────────────────────────────────────────────────────────
sum = aaaaaaaabbbbbbbbccccccccdddddddd
Как видите, только один бит в каждом столбце этого сложения может быть
ненулевой, и сумма этого столбца может быть только 0 или 1. Это означает, что
переносов не будет, а столбцы будут добавляться независимо от одного
Другая. Затем сумма составляется из битов один
, два
, три
и
четыре
объединены.
Точно такой же результат можно получить с помощью побитового оператора ИЛИ.
(|
) вместо +
. На самом деле, я бы предпочел использовать |
: на мой взгляд, это
делает намерение программиста более ясным.
Удивительное объяснение. Спасибо огромное!, @fmarquet
Для побитовых операций лучше использовать |
. В то время как +
будет работать при определенных обстоятельствах, |
лучше. Например:
a = 1 + 1 + 1 + 1; // а будет 4
a = 1 | 1 | 1 | 1; // а будет 1
Для кода, в котором вы просто пытаетесь установить один бит, гораздо предпочтительнее использовать |
, так как если бит уже установлен, а вы используете +
, вы очистить бит и установить следующий.
Это имеет смысл. Спасибо!, @fmarquet
- изменение одного бита в байте EEPROM Arduino
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Как читать и записывать EEPROM в ESP8266
- Какой реальный срок службы EEPROM?
- Как запомнить значения переменных после перезагрузки платы Arduino Uno R3
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Очистка EEPROM
- Как сохранить переменную с плавающей запятой в EEPROM
Это не совсем код Arduino. Arduino использует C++, поэтому на подобные вопросы можно ответить, обратившись к руководствам по C++. Специального языка «Ардуино» не существует., @Nick Gammon