Логика: and, or, xor, not

Урок про побитовую логику — инструмент для работы с отдельными битами и флагами.

Побитовая операция применяется к каждой паре бит независимо, что позволяет точечно включать, выключать и проверять биты.

Четыре базовые операции

КомандаЛогика по битамПрименение
and1, если оба бита 1выключить ненужные биты (маска)
or1, если хотя бы один 1включить нужные биты
xor1, если биты разныепереключить биты, обнулить регистр
notинвертирует каждый битполучить дополнение

Маски: точечная работа с битами

Чтобы оставить только младшие 4 бита числа, применяют маску and rax, 0x0F: единицы маски «пропускают» биты, нули — гасят. Чтобы гарантированно включить бит — or с маской, где этот бит равен 1.

and rax, 0x0F    ; оставить младшие 4 бита
or  rax, 0x80    ; включить старший бит байта
xor rax, rax     ; обнулить rax (идиома!)

xor rax, rax — стандартный способ обнулить регистр: любое число, «исключающее ИЛИ» с самим собой, даёт ноль. Это короче и быстрее, чем mov rax, 0.

Как работает под капотом

Покажем маску на Python: выделим младшие 4 бита числа и включим старший бит.

x = 0b10110101            # исходное число
low4 = x & 0x0F           # and: оставить младшие 4 бита
set_top = x | 0x80        # or: включить старший бит (он уже 1)
toggled = x ^ 0xFF        # xor: инвертировать все 8 бит
print("исходное :", format(x, '08b'))
print("младшие 4:", format(low4, '08b'))
print("инверсия :", format(toggled, '08b'))

Вывод:

исходное : 10110101
младшие 4: 00000101
инверсия : 01001010

Видно, что and с 0x0F обнулила старшие 4 бита, оставив младшие, а xor с 0xFF перевернула все биты. Этими приёмами реализуют флаги прав доступа, наборы опций, проверки чётности — везде, где данные пакуются в отдельные биты.

Частые ошибки

  • Использовать and вместо or для установки бита. and только гасит, включает биты or.
  • Забывать про test. test rax, rax делает and ради флагов, не меняя rax — удобно для проверки на ноль.
  • Путать логическое и арифметическое. not инвертирует все биты (это не «минус» — для отрицания есть neg).

Итог

  • and гасит биты по маске, or включает, xor переключает, not инвертирует.
  • Маски позволяют точечно работать с отдельными битами числа.
  • xor rax, rax — быстрая идиома обнуления регистра.
  • test проверяет биты через and, не меняя операнд.
Проверьте себя
1. Что делает идиома xor rax, rax?
AУдваивает rax
BОбнуляет rax
CИнвертирует биты rax
DКопирует rax в rbx
2. Какой операцией оставить только младшие 4 бита числа?
Aor rax, 0x0F
Band rax, 0x0F
Cxor rax, 0x0F
Dnot rax
3. Чем удобна команда test rax, rax?
AСкладывает rax с собой
BДелает and ради флагов, не меняя rax — удобно проверять на ноль
CПечатает значение rax
DОбнуляет флаги