Битовая операция

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая Incnis Mrsi (обсуждение | вклад) в 21:02, 23 июня 2007 (перенос статей XOR (аноним из 89.178.225.*) и Сложение по модулю 2 (user:Anushat)). Она может серьёзно отличаться от текущей версии.
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Битовые операции, иногда также булевы или логические операции (терминологические тонкости разъяснены в тексте) — операции над битами, применяемые в программировании и [цифровая техника|цифровой технике]], изучаемые в дискретной математике и математической логике.


Введение

Определение

Булевой операцией называется функция нескольких битовых аргументов (т.е. определённая на множестве из возможных состояний n бит), принимающая битовые значения (0 или 1). В принципе, сказанное является определением булевой функции (см. алгебра логики), однако под битовыми операциями подразумевается лишь некоторое (небольшое) количество таких функций, как правило от двух аргументов, или от одного (NOT). В частности, нас не интересуют функции, не зависящие от какого-то из своих аргументов.

В контексте цифровой схемотехники аргументы операции называются входами, а её результат — выходом.


Булевы операции и математическая логика

Булевы операции очень близки (хотя и не тождественны) логическим связкам в классической логике. Бит можно рассматривать как логическое суждение — его значениями являются 1 «истина» и 0 «ложь». При такой интерпретации известные в логике связки конъюнкции, дизъюнкции, импликации, отрицания и другие имеют представление на языке битов. И наоборот, битовые операции легко описываются на языке исчисления высказываний.


Булевы операции как основа цифровой техники

Булевы операции лежат в основе обработки цифровых сигналов. А именно, посредством них мы можем из одного или нескольких сигналов на входе получить на выходе новый сигнал, который в свою очередь может быть подан на вход одной или нескольким таким операциям. По сути, именно булевы операции в сочетании с запоминающими элементами (напр. триггерами) реализуют всё богатство возможностей современной цифровой техники.


Перечисление битовых операций

AND

Файл:AND.jpg

AND, «(логическое) И» — аналог конъюнкции в логике. Иногда называется логическим умножением.

Выдаёт 1 если оба входа равны 1, в противном случае 0. Если один из аргументов равен 1, то результат AND равен другому. Если один из аргументов равен 0, то результат AND равен 0 независимо от значения другого аргумента.

NOT

Файл:NOT.jpg

NOT, «(логическое) НЕ», инвертирование — аналог отрицания в логике.

Данная унарная операция (с одним входом) заменяет 0 на 1 и наоборот. Реализующий её элемент называется инвертором.

OR

Файл:AND.jpg

OR, «(логическое) ИЛИ» — аналог дизъюнкции в логике.

Выдаёт 1 если и только если хотя бы один из входов равен 1. Операция, двойственная AND: при инвертировании выхода и всех входов (т.е. при замене 0 и 1 местами) AND и OR взаимно превращается друг в друга.

XOR

XOR, «исключающее ИЛИ», «сложение по модулю 2» — аналог исключающего ИЛИ в логике.

Если один из аргументов равен 0, то результат равен другому. Если один из аргументов равен 1, то результат равен отрицанию другого аргумента. Первое русское название операции обусловлено тем, что результат данной операции отличается от результата OR только в одном случае из 4 случаев входа — обоих 1 (случай одновременной истинности аргументов «исключается»). Ещё в русской грамматике значение данной логической связки передаётся союзом «либо». Второе название — тем, что действительно является сложением в кольце вычетов по модулю 2, из чего следуют некоторые интересные свойства. Например, в отличие от вышеописанных AND и OR данная операция является обратимой, или инволютивной: . В графике XOR применяется при выводе спрайтов на картинку — повторное её применение убирает спрайт с картинки. Благодаря инволютивности же эта функция нашла применение в криптографии как простейшая реализация идеального шифра.

Операции от многих аргументов

Операции AND, OR и XOR являются не только коммутативными, но и ассоциативными, и потому легко обобщаются на случай нескольких аргументов (входов).


Прочие бинарные операции

NOR, она же «ИЛИ-НЕ», она же «стрелка Пирса».

Стрелка Пирса является результатом инвертирования результата OR своих аргументов, выдаёт значение 1 только когда оба входа 0.

NAND, она же «И-НЕ», она же «штрих Шеффера».

Двойственная стрелке Пирса операция: является результатом инвертирования результата AND своих аргументов, выдаёт значение 0 только когда оба входа 1. Известна простотой реализации в ТТЛ. Импликация («если-то») — аналог импликации в логике.
Совпадает с OR с инвертированным первым аргументом, выдаёт значение 0 только когда первый вход 1 а второй — 0. Данная операция не является коммутативной, в отличие от всех вышеописанных бинарных операций. Её можно понимать как арифметическое (меньше или равно). Эквиваленция. Выдаёт 1 если и только если оба аргумента равны между собой. Является результатом инвертирования результата XOR своих аргументов. Она же и двойственна XOR в вышеописанном смысле.

Сводная таблица истинности булевых операций

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.

Logical shift right

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-адресации (хотя не только).


Ссылки