Умножение числа на n-ю степень двойки реализуется сдвигом исходного значения на n позиций влево. Таким образом, последовательность операций 00110 (6) << 01100 (12) << 11000 (24) эквивалентна умножению числа 6 на 22; оператор «<<» используется для обозначения сдвига влево. Это же правило применимо и к отрицательным числам:
Смена значения знакового бита означает переполнение в старшем бите модуля числа. Некоторые компьютеры (микропроцессоры) поддерживают операцию арифметического сдвига влево, которая сигнализирует о такой ситуации в отличие от обычной операции логического сдвига влево, используемой для сдвига беззнаковых чисел.
Умножение на число, не являющееся степенью двойки, можно реализовать, комбинируя операции сдвига и суммирования. В частности, как показано в предыдущем примере (в), выражение 3x10 вычисляется следующим образом:
(3 х 8) + (3 х 2) = (3 х 10) или (3 << 3) + (3 << 1).
Аналогичным образом деление числа на n-ю степень двойки реализуется сдвигом значения на n позиций вправо, т. е. 1100 (12) >> 0110 (6) >> 0011 (3) >> 0001.1 (1.5). Этот же способ применим к знаковым числам:
Обратите внимание, что освободившиеся при сдвиге влево позиции заполняются не нулями, а содержимым знакового бита. Таким образом, при сдвиге положительных чисел слева вдвигаются нули, а при сдвиге отрицательных чисел — единицы. Данная операция известна как арифметический сдвиг вправо, в отличие от логического сдвига вправо, при котором всегда вдвигаются нули.
Деление на число, не являющееся степенью двойки, показано в примере (в). Эта операция осуществляется аналогично операции деления столбиком в десятичной системе. При ее выполнении по аналогии с умножением используется комбинирование операций сдвига и вычитания.
Арифметические действия — не единственные операции, которые можно осуществлять над двоичными числами. Английский математик Джордж Буль[18] (George Boole) в середине 19-го столетия создал раздел алгебры, касающийся символической обработки логических отношений. Этот раздел алгебры, называемый Булевой алгеброй, оперирует величинами, которые могут иметь только два состояния: истина или ложь. В 30-х годах стало понятно, что этот раздел математики может быть с успехом использован для анализа коммутационных схем и, соответственно, устройств двоичной логики. Мы ограничимся рассмотрением базовых логических операций этой алгебры переключательных схем.
Инверсия, или операция НЕ (NOT), обозначается символом надчеркивания. Таким образом, выражение f = А¯ означает, что переменная f является обратной величиной переменной А. То есть если А = 0, то f = 1, и, наоборот, если А = 1, то f = 0. На Рис. 1.1, а эта зависимость представлена в виде таблицы истинности (truth table). По определению двойная инверсия переводит переменную в первоначальное состояние: f= = f[19].
Рис. 1.1. Операция НЕ (NOT)
Как правило, реализации логических функций представляются с помощью абстрактных символов, а не подробных электрических схем. Общепринятое изображение элемента НЕ приведено на Рис. 1.1, б[20]. Кружок на изображении логических схем всегда означает инверсию и очень часто используется в сочетании с другими логическими элементами (см., например, Рис. 1.2, в).
Оператор И (AND) реализует функцию «все или ничего». Результат операции будет истинным только в том случае, если все n входов истинны. На Рис. 1.2 имеется две входные переменные, и выражение для выходного значения записывается как f = В∙А, где символ «» — булевый оператор И[21]. Количество входных переменных может быть любым, и в общем случае f = А(0)∙А(1)∙А(2)∙…∙А(n). Операцию И иногда называют операцией логического умножения, поскольку (по аналогии с обычным умножением) результат этой операции между любым битом и 0 всегда будет равен 0.
Рис. 1.2. Операция И (AND)
Если предположить, что вход В является управляющим входом, а вход А — входом данных, то, обратившись к таблице истинности, мы увидим, что при В = 1 на выходе будут присутствовать входные данные, а при В = 0 на выходе постоянно будет 0. Таким образом, эту схему можно рассматривать как управляемый вентиль. В общем случае термин вентиль применим к любой логической схеме, реализующей базовые логические операции.
В большинстве практических реализаций вентиля И используется инвертированный выход. Логическая функция такого элемента называется И-НЕ (NOT AND, или NAND), а ее изображение приведено на Рис. 1.2, в.