Побитовый оператор в вопросе кода Arduino

Что делает приведенный ниже код Arduino?

Я не знаком со знаком "+" в отношении побитовых операций. Просто знакомлюсь с этим материалом.

return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);

, 👍1

Обсуждение

Это не совсем код Arduino. Arduino использует C++, поэтому на подобные вопросы можно ответить, обратившись к руководствам по C++. Специального языка «Ардуино» не существует., @Nick Gammon


2 ответа


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


1

Для побитовых операций лучше использовать |. В то время как + будет работать при определенных обстоятельствах, | лучше. Например:

a = 1 + 1 + 1 + 1;  // а будет 4
a = 1 | 1 | 1 | 1;  // а будет 1

Для кода, в котором вы просто пытаетесь установить один бит, гораздо предпочтительнее использовать |, так как если бит уже установлен, а вы используете +, вы очистить бит и установить следующий.

,

Это имеет смысл. Спасибо!, @fmarquet