Калькулятор сдвига битов
Выполняет левый сдвиг, логический правый сдвиг и арифметический правый сдвиг для целых чисел, показывая результат в двоичном, десятичном и шестнадцатеричном виде.
Введите число, выберите тип и величину сдвига — и сразу увидите результат во всех трёх системах счисления.
Калькулятор сдвига битов
Выполняет левый сдвиг, логический правый сдвиг и арифметический правый сдвиг для целых чисел, показывая результат в двоичном, десятичном и шестнадцатеричном виде.
Сдвигает биты влево на n позиций. Эквивалентно умножению числа на 2ⁿ. Освободившиеся справа биты заполняются нулями.
О сдвиге битов
Сдвиг битов — одна из самых базовых операций в программировании и проектировании цифровой аппаратуры. Сдвиг перемещает все биты двоичного числа на заданное количество позиций влево или вправо, отбрасывая биты, вышедшие за край, и заполняя освободившиеся позиции с другой стороны в соответствии с типом сдвига.
Оператор левого сдвига (<<) перемещает все биты влево на n позиций. n битов, вышедших слева, отбрасываются, а справа добавляются n нулей. Левый сдвиг на n математически эквивалентен умножению целого числа на 2ⁿ, если не происходит переполнения. Например, 5 (двоичное 101), сдвинутое влево на 2, даёт 20 (двоичное 10100), потому что 5 × 4 = 20. Компиляторы часто заменяют умножение на степень двойки левым сдвигом, поскольку это обычно выполняется за один такт процессора.
Логический правый сдвиг (>>>) перемещает все биты вправо на n позиций. n битов, вышедших справа, отбрасываются, а слева добавляются n нулей. Это рассматривает число как беззнаковое и эквивалентно целочисленному делению на 2ⁿ с округлением вниз. Например, 40 (двоичное 101000), сдвинутое логически вправо на 3, даёт 5 (двоичное 000101). Логический правый сдвиг — стандартная операция для беззнаковых целых в языках вроде Java, где для этого явно используется >>>.
Арифметический правый сдвиг (>>) тоже перемещает биты вправо на n позиций, но вместо нулей слева копирует знаковый бит — самый старший бит. Для положительного числа (знаковый бит 0) вставляются нули, и поведение совпадает с логическим сдвигом. Для отрицательного числа (знаковый бит 1 в дополнительном коде) вставляются единицы, сохраняя отрицательный знак. Например, −16 (32-битный дополнительный код: ...11110000), сдвинутое арифметически вправо на 2, даёт −4 (двоичное ...11111100). Это сохраняет знак числа и эквивалентно делению знакового целого на 2ⁿ с округлением к минус бесконечности.
Сдвиги битов широко используются в производительном коде. Хэш-функции, криптографические алгоритмы, обработка изображений, аудиокодирование и разбор сетевых протоколов всё это используют ради эффективности. В аппаратуре регистры сдвига — базовые схемы, лежащие в основе последовательных протоколов связи, генераторов CRC и линейных регистров сдвига с обратной связью (LFSR), применяемых для генерации случайных чисел и скремблирования данных.
Примеры сдвига битов
Распространённые операции сдвига, показывающие связь между сдвигом и умножением или делением на степени двойки.
| Операция | Результат в двоичном виде | Проверка в десятичной системе |
|---|---|---|
| 5 << 2 (левый сдвиг на 2) | 10100 | 5 × 4 = 20 ✓. Левый сдвиг на 2 эквивалентен умножению на 2² = 4. |
| 40 >>> 3 (логический правый сдвиг на 3) | 101 | 40 ÷ 8 = 5 ✓. Логический правый сдвиг на 3 эквивалентен делению беззнакового числа на 2³ = 8. |
| −16 >> 2 (арифметический правый сдвиг на 2) | 11111100 (−4) | −16 ÷ 4 = −4 ✓. Арифметический сдвиг сохраняет знаковый бит, поэтому результат остаётся отрицательным. |
| двоичное 1010 << 1 (левый сдвиг на 1) | 10100 | Двоичное 1010 (10 в десятичной системе) становится 10100 (20 в десятичной системе). Левый сдвиг на 1 удваивает значение. |
Как пользоваться калькулятором сдвига битов
- Выберите формат ввода: 'Десятичная' для ввода целого числа в десятичной системе (отрицательные числа разрешены) или 'Двоичная' для ввода двоичной строки.
- Введите число в поле ввода. Для двоичного ввода используйте только 0 и 1.
- Выберите тип сдвига: 'Левый сдвиг (<<)' для умножения на степень двойки, 'Логический правый сдвиг (>>>)' для беззнакового деления или 'Арифметический правый сдвиг (>>)' для знакового деления.
- Введите величину сдвига — количество битовых позиций для сдвига (от 0 до 31).
- Нажмите 'Вычислить сдвиг'. Результат отобразится в двоичном, десятичном и шестнадцатеричном виде.
Часто задаваемые вопросы о сдвиге битов
В чём разница между логическим и арифметическим правым сдвигом?
Логический правый сдвиг всегда заполняет освободившиеся старшие биты нулями, рассматривая операнд как беззнаковый. Арифметический правый сдвиг заполняет освободившиеся старшие биты копией знакового бита — 0 для положительных чисел, 1 для отрицательных чисел в дополнительном коде. Для неотрицательных чисел обе операции дают одинаковый результат; различие появляется только при отрицательном операнде. В C/C++ оператор >> для знаковых типов на большинстве архитектур выполняет арифметический правый сдвиг.
Почему левый сдвиг эквивалентен умножению на степень двойки?
В двоичной системе каждая позиция бита представляет степень двойки. Если сдвинуть все биты на одну позицию влево, вклад каждого бита удваивается, значит удваивается и всё значение. Левый сдвиг на n позиций умножает на 2ⁿ. Например, 6 (110₂), сдвинутое влево на 3, даёт 110000₂ = 48, и 6 × 8 = 48. Компиляторы используют это тождество, чтобы заменить дорогие инструкции умножения более дешёвыми инструкциями сдвига, когда множитель — константа, равная степени двойки.
Что происходит, когда биты выходят за край?
Биты, которые выходят за пределы разрядности регистра, просто отбрасываются. При левом сдвиге старшие биты, переполняющие разрядность регистра, теряются, что может привести к неожиданному результату, если ответ не помещается в целевой тип. При правом сдвиге младшие биты, проходящие позицию 0, отбрасываются, что эквивалентно усечению к нулю (логический сдвиг) или к минус бесконечности (арифметический сдвиг).
Можно ли использовать сдвиги битов для деления?
Да. Логический правый сдвиг на n делит беззнаковое целое на 2ⁿ (с отбрасыванием дробной части). Арифметический правый сдвиг на n делит знаковое целое на 2ⁿ, округляя к минус бесконечности. Это не то же самое, что целочисленное деление в C для отрицательных чисел: −7 >> 1 = −4 (арифметический сдвиг), но −7 / 2 = −3 (в C усечение к нулю). Используйте подходящую операцию в зависимости от того, нужно ли вам округление вниз или усечение.
Какова максимальная величина сдвига?
Для 32-битных целых сдвиг на 32 или более позиций в C/C++ приводит к неопределённому поведению и обычно обрабатывается аппаратно по модулю 32 (сдвиг на n эквивалентен сдвигу на n mod 32). Этот калькулятор поддерживает сдвиги от 0 до 31 бита, покрывая полный 32-битный диапазон. Для больших сдвигов потребуется многословная арифметика или 64-битный целый тип.
Как сдвиги битов используются в реальных программах?
Сдвиги битов встречаются в самых разных задачах. Упаковка и распаковка битовых полей внутри целых чисел (заголовки сетевых пакетов, цветовые каналы пикселей), быстрое умножение и деление на степени двойки, вычисление хэш-значений, реализация криптографических примитивов вроде AES и SHA, извлечение полубайт и байтов из более крупных слов, а также вычисление битовых масок — всё это типичные применения. Всякий раз, когда программе нужно выделить или установить определённые биты, сдвиги и побитовые операции AND/OR — лучший инструмент.