Здесь mask
- это переменная, которая всегда будет содержать значение «степень 2».Цель состоит в том, чтобы в mask
всегда был установлен только один бит.Это mask
используется для проверки каждого бита в «изоляции».
В сочетании с логической AND
-функцией вы можете видеть его как фильтр, который дает вам только значение, которому соответствует конкретный бит, или ничего (ноль).
Помните, чтозначение двоичного слова с только одним установленным битом всегда соответствует значению степени 2 по определению.Таким образом, после проверки одного бита вы увидите либо ноль, либо значение степени 2.
Давайте рассмотрим некоторые практические значения во время работы программы (в предположении 8 бит).Таким образом, в цикле for это значение mask
выглядит с течением времени:
00000001
00000010
00000100
00001000
00010000
...
Примечание: вы также можете перейти в обратном направлении, например, если получатель хочет увидеть самое высокоебит первый и самый последний последний.Не знаю, что здесь нужно, но просто чтобы ты знал.Если вы хотите перейти в обратном направлении, вы инициализируете mask
с помощью (1 << (num_bits-1))
, а затем каждый раз в самом цикле переходите на один шаг вправо mask >>= 1
).
Каждое значение маски является побитовым AND
-ed (оператор &
) с входным значением signal
, чтобы "отфильтровать" тот конкретный интересующий нас бит.
Помните: результат этой операции AND
по-прежнему состоит из нескольких битов -- ни одного бита, поэтому мы не можем искать значение 1 (мы также должны были бы проверить для случаев 2, 4, 8 ... и т. д.).
Пример, так что давайтескажем, все биты включены, тогда логический вывод И будет выглядеть следующим образом:
00000001 AND 11111111 = 00000001
00000010 AND 11111111 = 00000010
00000100 AND 11111111 = 00000100
00001000 AND 11111111 = 00001000
00010000 AND 11111111 = 00010000
...
Обратите внимание, как в этом случае результат соответствует маске.Хотя значения каждый раз меняются, вы знаете, что когда вы получаете что-то ненулевое, бит, который вы тестируете, должен быть высоким!
И если все биты выключены, вы увидите это:
00000001 AND 00000000 = 00000000
00000010 AND 00000000 = 00000000
00000100 AND 00000000 = 00000000
00001000 AND 00000000 = 00000000
00010000 AND 00000000 = 00000000
Вы заметите, что легче проверить, равен ли результат нулю.Это означает, что бит был выключен.Именно поэтому код проверяет только нулевое значение, он знает, что бит равен 1
во всех других случаях!
Теперь хитрость заключается в том, чтобы получить правильное значение маски.Вам нужно сдвинуть битовое значение 1
влево на правильное место.Так, например, если вы начнете тестирование для бита 4, вы сдвинете 1 на четыре позиции влево, и вы получите (00010000 двоичный код).
Для этого мы используем оператор сдвига влево <<
.
Как уже говорили другие, ^
, к сожалению, делает что-то совершенно другое (XOR), что добавляет путаницу.