Для действий над битами Паскаль имеет следующие поразрядные операторы:
shl(сдвиг влево) – сдвигает биты влево на указанное количество разрядов, заполняя остающиеся справа разряды нулями.
shr(сдвиг вправо) – сдвигает биты вправо на указанное количество разрядов, заполняя остающиеся слева разряды нулями.
and – выполняет логическое умножение and над каждой соответствующей парой бит, возвращая 1, если оба бита содержат 1, или 0 в обратном случае.
or – выполняет логическое сложение or над каждой соответствующей парой бит, возвращая 0, если оба бита содержат 0, или 1 в обратном случае.
xor – выполняет логическое сложение по модулю 2 над каждой соответствующей парой бит, возвращая 1, если биты отличны друг от друга, или 0 в противном случае.
not – выполняет операцию логического дополнения над каждым битом, изменяя 0 на 1 и обратно. Эти оператоpы позволяют выполнять действия на очень низком уровне с целочисленными значениями.
Program ExBit;
Var A,B : Byte;
Begin
A:=15;B:=5;
Writeln(A And B);Writeln(A Or B);
Writeln(B shl 1);Writeln(A shr (B-2));
Writeln(A xor B);Writeln(Not A); Readln;
End.
Приведенная программа выдаст на экран числа: 5, 15, 10, 1, 10 и 240.
Имеется четыре логических оператоpа – and, xor, or и not, которые, хотя они и аналогичны поразрядным оператоpам, но не тождественны им. Логические опеpатоpы pаботают с логическими значениями (True и False), позволяя комбинировать выражения отношения, булевы переменные и булевы выражения.
Они отличаются от соответствующих поразрядных оператоpов следующим образом:
Логические оператоpы всегда в качестве результата дают значение True или False (то есть булево значение), в то время как поразрядные оператоpы выполняют побитовые действия над целочисленными значениями.
Эти операции не позволяют комбинировать булевы и целочисленные выражения. Другими словами, выражение Flag and Indx недопустимо, если Flag имеет булев тип, а Indx целочисленный тип (и наоборот). По умолчанию логические оператоpы and и or pаботают по короткой схеме, а оператоpы xor и not – нет. Допустим, имеется выражение exp1 and exp2. Если exp1 имеет значение False, то выражение в целом также будет иметь значение False, поэтому exp2 никогда не вычисляется. Аналогичным образом, если дано выражение exp1 or exp2, то exp2 никогда не вычисляется, если exp1 имеет значение True.
Оператоpы отношения позволяют сравнивать два значения, возвращая в результате булево значение Тrue или False.
Пример:
program TestGreater;
var A,B : integer;
Test : boolean;
begin
Write('Введите два числа: ');
Readln(A,B);
Test := A > B;
Writeln('A больше B', Test);
end.
При выполнении программы будет напечатано True, если A больше В, или False, если A меньше или равно В.