Время/числа
Побитовые операции
AND/OR/XOR/NAND/NOR/XNOR/NOT и сдвиги над целыми числами заданной разрядности (8/16/32/64 бит) в любой системе счисления.
(количество бит сдвига, десятичное число)
Побитовые операции работают напрямую с отдельными битами числа, а не с его значением целиком, — это основа флагов разрешений, сетевых протоколов и низкоуровневой оптимизации.
Как пользоваться
- Введите одно или два числа в любой системе счисления (двоичной, шестнадцатеричной, десятичной) и выберите операцию (AND, OR, XOR, NAND, NOR, XNOR, NOT или сдвиг).
- Выберите разрядность (8/16/32/64 бита) — это влияет на поведение NOT и сдвигов на границах числа.
- Результат показывается сразу в нескольких системах счисления для удобного сравнения.
Типичные сценарии
- Работа с флагами разрешений или настроек, упакованными в одно число (например, права доступа файловой системы).
- Отладка сетевого протокола или бинарного формата, где поля упакованы на уровне отдельных битов.
- Учебный пример для понимания двоичного представления чисел и операций над ним.
Что стоит помнить
Результат NOT и сдвигов зависит от выбранной разрядности — то же число даёт разный результат при 8-битной и 32-битной разрядности из-за разного количества битов.
XOR часто используют для переключения флага (toggle) — применение XOR дважды с тем же значением возвращает оригинал.
Статья об этом инструменте: Побитовые операции: как AND, OR и XOR работают на уровне битов
Часто задаваемые вопросы
Чем отличаются AND, OR, XOR, NAND, NOR, XNOR и NOT?
AND даёт 1 только когда оба бита 1, OR — когда хотя бы один 1, XOR — когда биты разные. NAND/NOR/XNOR — их отрицания, а NOT инвертирует каждый бит одного операнда.
Как учитывается разрядность и знак числа?
Выберите разрядность 8/16/32/64 бита — именно в её пределах выполняются операции и сдвиги. Отрицательные числа представлены в дополнительном коде (two's complement), поэтому результат NOT или сдвига для них может выглядеть неожиданно, если вы привыкли к десятичной записи.
В чём разница между левым и правым сдвигом?
Сдвиг влево (<<) добавляет нули справа, фактически умножая на 2 в степени сдвига. Сдвиг вправо бывает логическим (добавляет нули слева) или арифметическим (сохраняет знаковый бит) — тип зависит от выбранного режима.
Почему выражение "if (a & b == c)" часто работает не так, как ожидалось?
В большинстве языков оператор сравнения == имеет более высокий приоритет, чем побитовый &, поэтому выражение вычисляется как "a & (b == c)", а не так, как обычно ожидает автор. Чтобы избежать этой ловушки, всегда оборачивайте побитовые операции в явные скобки.
Зачем вообще использовать побитовые флаги вместо отдельных булевых переменных?
Набор флагов в одном числе компактнее хранится и передаётся (например, в сетевых протоколах или файловых форматах), а проверка или изменение конкретного флага через AND/OR/XOR выполняется за одну быструю операцию.