Введение
В компьютерном программировании битовая операция оперирует битовой строкой, битовым массивом или двоичным числом (рассматриваемым как битовая строка) на уровне отдельных битов. Это быстрая и простая операция, являющаяся основой для арифметических операций более высокого уровня и напрямую поддерживаемая процессором. Большинство битовых операций представлены в виде инструкций с двумя операндами, где результат заменяет один из входных операндов. На простых и недорогих процессорах битовые операции, как правило, существенно быстрее деления, в несколько раз быстрее умножения, а иногда и значительно быстрее сложения. В то время как современные процессоры обычно выполняют сложение и умножение с той же скоростью, что и битовые операции, благодаря более длинным конвейерам команд и другим архитектурным решениям, битовые операции обычно потребляют меньше энергии из-за меньшего использования ресурсов.
In computer programming, a bitwise operation operates on a bit string, a bit array or a binary numeral (considered as a bit string) at the level of its individual bits. It is a fast and simple action, basic to the higher level arithmetic operations and directly supported by the processor. Most bitwise operations are presented as two operand instructions where the result replaces one of the input operands. On simple low cost processors, typically, bitwise operations are substantially faster than division, several times faster than multiplication, and sometimes significantly faster than addition. While modern processors usually perform addition and multiplication just as fast as bitwise operations due to their longer instruction pipelines and other architectural design choices, bitwise operations do commonly use less power because of the reduced use of resources.
Операторы по битам
В приведенных ниже объяснениях любое указание на позицию бита отсчитывается справа (от младшего разряда), двигаясь влево. Например, двоичное значение 0001 (десятичное 1) содержит нули во всех позициях, кроме самой первой (то есть крайней правой).
Битовые сдвиги
Битовые сдвиги иногда рассматриваются как побитовые операции, поскольку они оперируют значением как последовательностью битов, а не как числовой величиной. В этих операциях разряды перемещаются влево или вправо. Регистры в компьютерном процессоре имеют фиксированную ширину, поэтому часть битов "выталкивается" из регистра с одного конца, а такое же количество битов "добавляется" с другого конца; различия между операторами сдвига заключаются в том, как они определяют значения добавляемых битов.
Логический сдвиг
В логическом сдвиге нули подставляются на место отброшенных битов. Поэтому логический и арифметический сдвиги влево полностью идентичны. Однако, поскольку логический сдвиг вправо вставляет нули в старший бит, а не копирует знаковый бит, он оптимален для беззнаковых двоичных чисел, в то время как арифметический сдвиг вправо оптимален для знаковых двоичных чисел, представленных в дополнительном коде.
Круглый сдвиг
Другая форма сдвига — круговой сдвиг, битовое вращение или циклический сдвиг.
Повернись .
В этой операции, иногда называемой циклическим сдвигом без переноса, биты "вращаются" так, как если бы левый и правый концы регистра были соединены. Значение, которое сдвигается вправо при левом сдвиге, является значением, которое было сдвинуто влево, и наоборот при правом сдвиге. Это полезно, когда необходимо сохранить все существующие биты, и часто используется в цифровой криптографии.
Повернитесь через ношение
Вращение через перенос – это вариант операции вращения, при котором бит, сдвигаемый внутрь (с любого конца), является предыдущим значением флага переноса, а бит, сдвигаемый наружу (с другого конца), становится новым значением флага переноса. Одно вращение через перенос может имитировать логический или арифметический сдвиг на одну позицию, предварительно установив флаг переноса. Например, если флаг переноса содержит 0, то операция "x RIGHT ROTATE THROUGH CARRY BY ONE" является логическим сдвигом вправо, а если флаг переноса содержит копию знакового бита, то "x RIGHT ROTATE THROUGH CARRY BY ONE" является арифметическим сдвигом вправо. По этой причине некоторые микроконтроллеры, такие как недорогие PIC, имеют только операции вращения и вращения через перенос, и не реализуют отдельные инструкции для арифметического или логического сдвига. Вращение через перенос особенно полезно при выполнении сдвигов для чисел, превышающих разрядность машинного слова процессора, поскольку, если большое число хранится в двух регистрах, бит, сдвигаемый с одного конца первого регистра, должен поступать на другой конец второго регистра. При вращении через перенос этот бит "сохраняется" во флаге переноса во время первого сдвига и готов к сдвигу внутрь во время второго сдвига без дополнительной подготовки.
Булева алгебра
Иногда полезно упрощать сложные выражения, состоящие из побитовых операций, например, при разработке компиляторов. Задача компилятора — преобразовать язык программирования высокого уровня в максимально эффективный машинный код. Булева алгебра применяется для упрощения сложных побитовых выражений.