Побитовый оператор в вопросе кода 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