Битовая операция
Битовые операции, иногда также булевы или логические операции (терминологические тонкости разъяснены в тексте) — операции над битами, применяемые в программировании и [цифровая техника|цифровой технике]], изучаемые в дискретной математике и математической логике.
Введение
Определение
Булевой операцией называется функция нескольких битовых аргументов (т.е. определённая на множестве из возможных состояний n бит), принимающая битовые значения (0 или 1). В принципе, сказанное является определением булевой функции (см. алгебра логики), однако под битовыми операциями подразумевается лишь некоторое (небольшое) количество таких функций, как правило от двух аргументов, или от одного (NOT). В частности, нас не интересуют функции, не зависящие от какого-то из своих аргументов.
В контексте цифровой схемотехники аргументы операции называются входами, а её результат — выходом.
Булевы операции и математическая логика
Булевы операции очень близки (хотя и не тождественны) логическим связкам в классической логике. Бит можно рассматривать как логическое суждение — его значениями являются 1 «истина» и 0 «ложь». При такой интерпретации известные в логике связки конъюнкции, дизъюнкции, импликации, отрицания и другие имеют представление на языке битов. И наоборот, битовые операции легко описываются на языке исчисления высказываний.
Булевы операции как основа цифровой техники
Булевы операции лежат в основе обработки цифровых сигналов. А именно, посредством них мы можем из одного или нескольких сигналов на входе получить на выходе новый сигнал, который в свою очередь может быть подан на вход одной или нескольким таким операциям. По сути, именно булевы операции в сочетании с запоминающими элементами (напр. триггерами) реализуют всё богатство возможностей современной цифровой техники.
Перечисление битовых операций
AND
AND, «(логическое) И» — аналог конъюнкции в логике. Иногда называется логическим умножением.
Выдаёт 1 если оба входа равны 1, в противном случае 0. Если один из аргументов равен 1, то результат AND равен другому. Если один из аргументов равен 0, то результат AND равен 0 независимо от значения другого аргумента.NOT
NOT, «(логическое) НЕ», инвертирование — аналог отрицания в логике.
OR
OR, «(логическое) ИЛИ» — аналог дизъюнкции в логике.
XOR
XOR, «исключающее ИЛИ», «сложение по модулю 2» — аналог исключающего ИЛИ в логике.
Операции от многих аргументов
Операции AND, OR и XOR являются не только коммутативными, но и ассоциативными, и потому легко обобщаются на случай нескольких аргументов (входов).
Прочие бинарные операции
NOR, она же «ИЛИ-НЕ», она же «стрелка Пирса».
NAND, она же «И-НЕ», она же «штрих Шеффера».
Сводная таблица истинности булевых операций
x | y | x&y () | ~x (math>\neg</math>) | x OR y () | x^y () | xy () | xy | xy | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | |
0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | |
1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | |
1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
Операции над битовыми векторами
Обобщение операций на булеву алгебру
Вместо одиночных битов мы можем рассмотреть векторы из фиксированного количества бит (в программировании их называют регистрами), например, байты. В программировании регистры рассматривают как двоичное разложение целого числа: , где N — количество битов в регистре.
Тем не менее, ничто не мешает рассматривать эти регистры именно как битовые векторы и проводить булевые операции покомпонентно (бит номер k значения есть результат операция от битов номер k аргументов).
Кстати, математически говоря, булевы операции распространяются таким образом на произвольную булеву алгебру.
Таким образом мы получаем операции побитового И, ИЛИ, НЕ, XOR и т.д.
Как арифметические, данные операции не обладают хорошими свойствами за исключением побитового NOT (НЕ), которое для чисел в дополнительном коде совпадает с вычитанием из -1 (~x == -1-x
).
Однако, они очень полезны в программировании.
Сдвиги регистров
Помимо вышеописанных побитных (или булевых) операций, к битовым операциям над битовыми векторами традиционно перечисляют так называемые сдвиги регистров. Они не производят операций над отдельными битами, а лишь перемещают их.
SHL (сдвиг влево). Значение бита номер k результата равно значению бита номер k-1 аргумента если , или 0 если k равно нулю. В целочисленной арифметике данная операция соответствует умножению на 2.
SHR (логический сдвиг вправо). Значение бита номер k результата равно значению бита номер k+1 аргумента. Биты с номерами, выходящими за пределы размера регистра аргумента считаются равными нулю. В целочисленной арифметике данная операция соответствует делению на 2 беззнаковых (неотрицательных) чисел.
SAR (арифметический сдвиг вправо). Значение старшего бита результата равно значению старшего бита аргумента. Для остальных битов результата, значение бита номер k равно значению бита номер k+1 аргумента. В целочисленной арифметике данная операция соответствует делению на 2 чисел в дополнительном коде, и отличается от предыдущей только тем, что старший бит удваивается а не заполняется значением 0.
2-адическая интерпретация
Целое число, записанное (в дополнительном коде) в бесконечный (в сторону положительных степеней двойки) двоичный регистр является естественным объектом для теории p-адических чисел при . Множество целых 2-адических чисел (т.е. произвольных бесконечных битовых последовательностей) может быть рассмотрено как булева алгебра точно так же как и множество значений битового регистра конечной длины. Все вышеперечисленные битовые операции оказываются непрерывными отображениями. Хотя практическое программирование не располагает регистрами бесконечной длины, это не мешает использовать данный теоретический факт в криптографии для создания быстродействующих алгоритмов шифрования.
Практические применения
Физическая реализация битовых операций
Наиболее распространены электронные реализации битовых операций при помощи транзисторов, например транзисторно-транзисторная логика и КМОП; в первой половине XX века вместо транзисторов применяли электронные лампы. Однако, реализация битовых операций может в принципе быть любой: механической, электромеханической, гидравлической или пневматичесой, оптической и даже химической.
В квантовых вычислениях из перечисленных булевых операций реализуются только NOT и XOR (с некоторыми оговорками). Квантовых аналогов AND, OR и т.д. не существует.
Схемы аппаратной логики
Результат операции NOR или OR ото всех бит двоичного регистра проверяет, равно ли значение регистра нулю; то же самое взятое от выхода XOR двух регистров проверяет равенство их значений между собой.
Битовые операции применяются в знакогенераторах и графических адаптерах; особенно велика была их роль в адаптере EGA в режимах с 16 цветами — хитроумное сочетание аппаратной логики адаптера с логическими командами центрального процессора позволяет рассматривать EGA как первый в истории графический ускоритель.
Использование в программировании
Благодаря реализации в схеме процессора, ряд регистровых битовых операций программно доступен в языках низкого уровня, а также в языке C. В большинстве процессоров реализованы в качестве элементарной операции регистровый NOT, регистровые двухаргументные AND, OR, XOR, проверка равенства нулю (см. выше), все три типа битовых сдвигов (а заодно и циклические битовые сдвиги).
Регистровая операция AND используется для сброса конкретного бита, OR — для установки, XOR — для инвертирования (т.е. для проведения операции NOT над конкретным битом с сохранением остальных нетронутыми). Регистровый AND с последующей проверкой равенства нулю используется для чтения значения конкретного бита.
Операция AND также используется для наложения маски — например, в IP-адресации (хотя не только).