| > s := s + Chr( Ord( '0' ) + bit ) { запись в строку }
| >end; {for} { конец цикла }
| > Delete( s, 1, 32-NumOfBits ); { отсечение лишних битов}
| > Binary := s { возвращаемая строка }
| END;
| >VAR i : Integer; {=== ПРИМЕР ВЫЗОВА === }
| BEGIN
| >for i:=-5 to 5 do
| > WriteLn(i:7, '--> ', Binary( i, 8*SizeOf(i)));
| > Readln { пауза до нажатия клавиши ввода }
| END.
Рис. 9.1
Итак, какие же действия предоставляет поразрядная арифметика? Первая группа — это логические операции над битами (табл. 9.2).
Таблица 9.2
Операции | Название | Форма записи | Приоритет |
not | Поразрядное отрицание | not A | 1 (высший) |
and | Логическое умножение | A1 and A2 |
|
or | Логическое сложение | A1 or A2 |
|
xor | Исключающее 'ИЛИ' | A1 xor A2 | 4 (низший) |
Not — поразрядное отрицание — «переворачивает» значение каждого бита на противоположное. Так, если A в двоичном виде представляется как 01101100, то not A станет 10010011:
not [1] = 0
not [0] = 1
Квадратные скобки вокруг аргументов обозначают действие над одним битом.
- 167 -
And — так называемое логическое умножение или поразрядная операция 'И':
[0] and [1] = [1] and [0] = [0]
[0] and [0] = [0]
[1] and [1] = [1]
Здесь аргументы специально взяты в скобки — их надо рассматривать как отдельные единичные биты; реальные же примеры не столь очевидны:
(6 and 4) = 4
(6 and 1) = 0
и т.п. Все станет ясно, если 6 и 4 представить как двоичные числа:
0000110 (6) 0000110 (6)
and 0000100 (4) и and 0000001 (1)
______________ ______________
0000100 (4) 0000000 (0)
Впрочем, вовсе не обязательно записывать числа в виде нулей и единиц. Операция and в 99% случаев нужна для двух целей: проверить наличие битов или убрать ( т.е. обнулить) некоторые из них.
Такая проверка нужна, когда число является набором флагов. Например, большое число системных ячеек памяти ПЭВМ содержит сведения о конфигурации машины или ее состоянии. При этом один байт может трактоваться так: бит 6 равен 1 — значит включен режим CapsLock, бит 4 равен 0 — следовательно какой-либо другой режим Lock выключен и т.д. Пусть A содержит этот самый байт с восемью флагами, и надо проверить состояние бита номер 5 (нумерация идет справа налево, от 0 до 7). Единица в бите 5 дает число 2>5 = 32. Это второй аргумент. Если в A в пятом бите есть единица, то должно выполниться условие
( A and 32 ) = 32
Осталось оформить все это в оператор IF. Можно проверить наличие сразу нескольких «включенных» битов, например, 5-го, 2-го и 0-го. Число с единицами в этих позициях и нулями в остальных равно 2+2 + 1 = 32+4+1 = 37. Если A среди прочих имеет единицы в битах 5, 2 и 0, то в этом случае будет истинным выражение