Время/числа

Побитовые операции

AND/OR/XOR/NAND/NOR/XNOR/NOT и сдвиги над целыми числами заданной разрядности (8/16/32/64 бит) в любой системе счисления.

Bitwise operations work directly on a number's individual bits rather than its value as a whole — the basis for permission flags, network protocols, and low-level optimization.

How to use it

Common uses

Things to keep in mind

The result of NOT and shifts depends on the chosen bit width — the same number gives a different result at 8-bit versus 32-bit width because of the different number of bits involved.

XOR is often used to toggle a flag — applying XOR twice with the same value returns the original.

Статья об этом инструменте: Побитовые операции: как 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 выполняется за одну быструю операцию.

Статьи: Время/числа

Unix-время: почему компьютеры считают время с 1970 года

Почему именно 1 января 1970 года стало точкой отсчёта времени для большинства компьютерных систем.

Cron-выражения: как расшифровать расписание запуска задач

Как расшифровать выражение вроде */15 * * * * и понять, когда именно запустится задача.

Системы счисления: зачем нужны двоичная, восьмеричная и шестнадцатеричная

Почему цвет #FF5733 в CSS записан шестнадцатеричными цифрами, а не десятичными.

Разница между датами: почему подсчёт дней сложнее, чем кажется

Почему наивное вычитание дат может дать неправильный результат из-за високосных годов.

Расчёт возраста: почему это не простое вычитание годов

Почему простое вычитание годов рождения может дать возраст на единицу больше реального.

Часовые пояса: почему UTC — это не то же самое, что GMT

Почему UTC не меняется дважды в год, а время в Лондоне (GMT/BST) — меняется.

Расчёт длительности: как правильно суммировать часы, минуты и секунды

Почему при сложении минут и секунд нужно «переносить» остаток в следующий разряд, как при десятичном сложении.

ISO 8601 Duration: как записать длительность в стандартном формате

Почему запись PT1H30M означает «1 час 30 минут», а не «1 минута 30 часов».

Номер недели: почему в разных странах недели считают по-разному

Почему 1 января иногда относится к 52-й или 53-й неделе предыдущего года по стандарту ISO 8601.

Римские цифры: как устроена система без нуля и разрядов

Почему IV означает 4, а не 6, и как правило вычитания работает в римских цифрах.

IEEE 754: почему 0.1 + 0.2 не равно 0.3 в коде

Почему почти в каждом языке программирования 0.1 + 0.2 выводит 0.30000000000000004.

Число прописью: зачем превращать цифры в слова

Почему в банковских документах сумму пишут и цифрами, и словами одновременно.