Программистский и побитовый калькулятор

Введите одно выражение, используя шестнадцатеричные литералы 0x, двоичные 0b и восьмеричные 0o, побитовые операторы & | ^ ~, сдвиги << >> >>>, циклические сдвиги и обычную арифметику — результат обновляется сразу в десятичном, шестнадцатеричном, восьмеричном и двоичном виде при размере слова 8, 16, 32 или 64 бита, со знаком или без. Ниже — кликабельная сетка битов, двухоперандная панель побитовых операций (И / ИЛИ / XOR / NAND / NOR / НЕ / сдвиги / ROL / ROR) и установка, сброс и переключение одного бита. Для простого перевода систем счисления без битовой логики см. Конвертер систем счисления; для статистики — Калькулятор статистики.
Размер слова Просмотр Операторы: & | ^ ~ << >> >>> + - * / % ( ) — только целочисленная арифметика, результаты обрезаются по размеру слова.
DEC
HEX
OCT
BIN
Биты показаны от старшего к младшему; затемнённые ячейки выходят за текущий размер слова.
номер бита (0 = младший)
A =    B = A и B принимают полные выражения (например, 1 << 12).
Таблица результатов появится, когда A и B разберутся. Сдвиги и циклические сдвиги берут количество из B.
Попробуйте пример:
Как ведут себя сдвиги: << обрезает результат по размеру слова (биты, выходящие за старший разряд, пропадают). >>> — всегда логический (беззнаковый) сдвиг. >> следует селектору Просмотр: арифметический в знаковом режиме, логический в беззнаковом. Конфиденциальность: весь калькулятор работает в этой вкладке — без сервера и без хранения.

Что такое программистский калькулятор?

Программистский калькулятор выполняет арифметику так, как компьютер её хранит: в словах фиксированной ширины из битов. Вместо бесконечной числовой прямой 8-битное слово — это круг из 256 значений, 32-битное — круг из 4 294 967 296. Каждый результат заворачивается обратно в этот круг, и те же биты можно прочитать как беззнаковое число (0 … 255) или как знаковое значение в дополнительном коде (−128 … 127). Четыре строки систем счисления выше — те же биты, записанные четырьмя способами: измените одну — остальные три последуют.

Почему программисты живут в шестнадцатеричной системе

Одна шестнадцатеричная цифра — ровно четыре бита, поэтому байт всегда записывается двумя hex-цифрами, 32-битное слово — восемью. Hex — это двоичная запись с группировкой нулей для удобства человека:

ДвоичноеHexДесятичное
1111 11110xFF255
0001 01100x1622
1000 00000x80128 (или -128 со знаком)

Дополнительный код в одном абзаце

Чтобы прочитать слово как знаковое, посмотрите на старший бит. Если он 0, значение — просто беззнаковое число. Если 1, вычтите размер круга: 8-битный 0xFF равен 255 − 256 = −1. Вот и весь трюк: -x и 0 - x дают одинаковые биты, поэтому один и тот же сумматор работает для обоих. Смена знака — это «инвертировать все биты и прибавить 1»: НЕ(0x01) = 0xFE, +1 = 0xFF = −1.

Операторы сдвига на одном взгляде

ОператорНазваниеПример 8 бит (a = 0xF0)
a << 1сдвиг влево0xE0 — старший бит выпадает, снизу входит ноль
a >> 1 (беззнаковый)логический сдвиг вправо0x78 — нули входят сверху
a >> 1 (знаковый, a = −16)арифметический сдвиг вправо0xF8 = −8 — знаковый бит копируется
a >>> 1всегда логический0x78 независимо от селектора Просмотр
rol(a, 1)циклический сдвиг влево0xE1 — выпавший старший бит возвращается снизу

Типичные ошибки, которых помогает избежать эта страница

Арифметический сдвиг против логического: копирование знакового бита (арифметический) и заполнение нулями (логический) различаются, когда старший бит установлен — переключите селектор Просмотр и посмотрите, как 0xF0 >> 1 меняется между 0x78 и 0xF8.
Сюрприз 53 бит: обычный тип Number в JavaScript — 64-битное число с плавающей точкой, в котором лишь 53 бита безопасны для целых, поэтому 0xFFFFFFFFFFFFFFFF нельзя представить точно — эта страница внутри использует точную 64-битную целочисленную арифметику, поэтому каждая видимая hex-цифра надёжна.
Ловушки чисел с плавающей точкой: 0.1 + 0.2, как известно, даёт 0.30000000000000004; этот калькулятор целочисленный по замыслу — деление усекает к нулю, точно как / для int в C.
Ведущие нули: в старом C литерал вроде 052 означал восьмеричное число. Здесь десятичное записывается обычными цифрами, а восьмеричное требует префикса 0o, поэтому ничего не двусмысленно.

Частые вопросы

Какое самое большое число? — 64-битное беззнаковое: 18 446 744 073 709 551 615 (0xFFFFFFFFFFFFFFFF); знаковое: ±9 223 372 036 854 775 808.
Почему 1 << 8 стало 0? — размер слова 8 бит; бита 8 не существует, и маска его отбрасывает. Переключитесь на 16/32/64 бита, чтобы сохранить его.
Что делает ~? — побитовое НЕ: каждый бит инвертируется в пределах текущего размера слова, поэтому ~0 — все единицы (255 / 65535 / −1 …).
Есть ли числа с плавающей точкой? — нет, только целые; для float, тригонометрии и функций используйте Научный калькулятор.
Покидает ли что-нибудь мой компьютер? — нет: ни сервера, ни хранения, ни аналитики; закройте вкладку, и всё исчезнет.