Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 107

| > 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, то в этом случае будет истинным выражение