7. Логический тип данных. Операции сравнения. Логические операции. Битовые операции

Логические, или булевские, данные предназначены для хранения логических значений "истина" или "ложь". Логические переменные и константы имеют тип Boolean и занимают в памяти 1 байт. Существует всего две логические констан­ты - TRUE и FALSE. Тип Boolean - это порядковый тип, поэтому для него опре­делены функции Ord, Pred, Succ и процедуры Inc и Dec (впрочем, довольно редко применяемые), причем Ord(FALSE) =0, Ord(TRUE) =1. Прежде чем пе­рейти к логическим операциям, рассмотрим операции сравнения, которых в Пас­кале существует шесть :

= равно;

<>   не равно;

< меньше;

<=   меньше или равно;

> больше;

>= больше или равно. Операции сравнения определены для любых однотипных операндов (число­вых, символьных, логических); для числовых данных, так же, как и в случае арифметических операций, сделано исключение - вы можете сравнивать два чи­словых выражения любых типов, но сравнивать число и символ, число и логиче­скую величину, символ и логическую величину нельзя! Результат операции сравнения есть TRUE или FALSE, в зависимости от того, выполнено или не вы­полнено условие. Числа сравниваются между собой естественным образом, сим­волы - в соответствии с их номерами, а для логических величин справедливо не­равенство FALSE<TRUE. Логических, или булевских, операций в Паскале че­тыре :

NOT - логическое отрицание; AND - логическое "и"; OR - логическое "или"; XOR - логическое исключающее "или". Правила выполнения этих операций таковы :

NOT - унарная (т.е. применимая к одному операнду) операция : NOT FALSE = TRUE , NOT TRUE = FALSE . Правила выполнения бинарных операций AND, OR и XOR приведены в таб­лице 3.

Таблица 3

Правила выполнения бинарных операций

Операнд

Результат операции

a

b

a AND b

a OR b

a XOR b

FALSE

FALSE

FALSE

FALSE

FALSE

FALSE

TRUE

FALSE

TRUE

TRUE

TRUE

FALSE

FALSE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

FALSE

Приоритет операции NOT (как и всякой унарной операции) наивысший, сле­дующий приоритет у операции AND, и наинизший приоритет - у операций OR и XOR. Выражения могут содержать не только разные логические операции, но и операции сравнения и арифметические, поэтому отметим, что приоритет логиче­ских и арифметических операций выше, чем операций сравнения. Существует функция, определенная для целочисленных аргументов и имеющая логическое значение, - это функция

30. Odd(x).

Она возвращает TRUE, если значение x нечетное, и FALSE, если оно четное. Логические значения можно выводить процедурой WRITE, но вводить логиче­ские переменные процедурой READ нельзя. Теперь попробуем записать про­грамму, использующую логические данные.

VAR a,b,c,d : INTEGER;

BEGIN WRITELN('Введите 4 целых числа, a,b,c и d, среди ',

'которых должно быть 2 и только 2 одинаковых!');

WRITE('a='); READ(a); WRITELN; WRITE('b='); READ(a); WRITELN; WRITE('c='); READ(a); WRITELN; WRITE('d='); READ(a); WRITELN;

WRITELN('Вашу понятливость можно оценить как ', (a=b)AND(a<>c)AND(a<>d)AND(c<>d)OR (a=c)AND(a<>b)AND(a<>d)AND(b<>d)OR (a=d)AND(a<>b)AND(a<>c)AND(b<>c)OR (b=c)AND(b<>a)AND(b<>d)AND(a<>d)OR (b=d)AND(b<>a)AND(b<>c)AND(a<>c)OR

(c=d)AND(c<>a)AND(c<>b)AND(a<>b));

READLN;

END.

Программа выведет TRUE, если введенные данные удовлетворили условию, и FALSE - в противном случае.

Рассмотрим теперь битовые операции: AND, OR, XOR, ShL и ShR, которые определены для целочисленных операндов (операции AND,OR и XOR совпада­ют по написанию с логическими операциями, но последние определены только для логических операндов). Операции AND, OR и XOR выполняются над каж­дой парой соответствующих битов операндов по тем же правилам, что и логиче­ские операции, если нулевой бит считать ложным, а единичный - истинным. Приведем простой пример: VAR a,b : BYTE;

BEGIN a:=100; b:=200;

WRITELN(a AND b,' ',a OR b,' ',a XOR b);

END.

Программа выведет числа 64, 236, 172. Каким образом они получены? Дво­ичное представление числа 100 равно 0110 0100, двоичное представление числа 200 равно 1100 1000. Выполним над этими числами, например, операцию XOR : 0110 0100 1100 1000

XOR

1010 1100.

Получили двоичное число 1010 1100 = 128+32+8+4 = 172.

Операции ShL и ShR называются операциями соответственно левого сдвига и правого сдвига. Они сдвигают биты первого операнда на количество разрядов, равное значению второго операнда, освободившиеся разряды заполняются нуле­выми битами. Например:

10 8ЬЬ 3 = 80 40 8пЯ 3 = 5.

Число 10 кодируется как 0000 1010; сдвинем биты влево на 3 разряда, получим 0101 0000 = 64+16 = 80. Таким образом, сдвигая биты влево на п разрядов, мы умножаем число на 2 в степени п, а сдвигая вправо - делим на 2 в степени п. Этим свойством операций сдвига пользуются, когда в программе приходится часто умножать или делить целые числа на степень двойки, т.к. операции сдвига выполняются намного быстрее, чем арифметические операции.