Логика: and, or, xor, not
Урок про побитовую логику — инструмент для работы с отдельными битами и флагами.
Побитовая операция применяется к каждой паре бит независимо, что позволяет точечно включать, выключать и проверять биты.
Четыре базовые операции
| Команда | Логика по битам | Применение |
and | 1, если оба бита 1 | выключить ненужные биты (маска) |
or | 1, если хотя бы один 1 | включить нужные биты |
xor | 1, если биты разные | переключить биты, обнулить регистр |
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, не меняя операнд.