Песни о Паскале
Шрифт:
Writeln;
Writeln('C= A AND B');
Writeln('A= ',ConvertTo2(A), A:5);
Writeln('B= ',ConvertTo2(B), B:5);
Writeln('C= ',ConvertTo2(C), C:5);
C:= not A; { логическое отрицание (инверсия) }
Writeln;
Writeln('C= NOT A');
Writeln('A= ',ConvertTo2(A), A:5);
Writeln('C= ',ConvertTo2(C), C:5);
until A=0;
end.
Главная программа не должна вызывать вопросов: после ввода пары чисел и выполнения логических операций с ними, на экран выводятся как исходные числа, так и результаты. Причем выводятся и в двоичной, и
C= A OR B
A= 00001101 13
B= 00001011 11
C= 00001111 15
C= A AND B
A= 00001101 13
B= 00001011 11
C= 00001001 9
C= A XOR B
A= 00001101 13
B= 00001011 11
C= 00000110 6
C= NOT A
A= 00001101 13
C= 11110010 242
По результатам этих опытов выведены правила для логических операций (табл. 12). Логическое отрицание «НЕ» отличается от прочих тем, что применяется к одному операнду.
Табл. 12 – Правила выполнения логических операций с битами
Логическая операция
Пример
Правило
«ИЛИ» (сложение)
1010 OR11001110
Результат единица, если ХОТЯ БЫ ОДИН из операндов равен единице.
«И» (умножение)
1010 AND1100
1
00
0
Результат единица, если ОБА операнда равны единице.
«Исключающее ИЛИ» (сравнение)
1010 XOR1100
0
110
Результат единица, если операнды ОТЛИЧАЮТСЯ.
«НЕ» (отрицание)
1010 NOT0101
Результат единица, если операнд РАВЕН НУЛЮ.
Заменив в этих правилах единицу на TRUE, а ноль на FALSE, вы получите правила для булевых данных.
Сдвиги влево и вправо
Сдвиг – одна из тех операций обработки регистров, которые выполняют все процессоры. В Паскале тоже предусмотрены две такие операции с числами: сдвиг влево (SHL) и сдвиг вправо (SHR).
Операция левого сдвига (рис. 109) перемещает все биты слова на заданное число позиций влево, при этом младшие биты заполняются нулями, а старшие теряются, например:
N:= 3; { 3 = 00000011 }
Writeln (N shl 1); { 6 = 00000110 }
Writeln (N shl 2); { 12 = 00001100 }
Рис.109 – Сдвиг байта на один разряд влево
Операция правого сдвига (рис. 110) перемещает все биты слова на заданное число позиций вправо. При этом старшие биты заполняются нулями, а младшие теряются.
N:= 3; { 3 = 00000011 }
Writeln (N shr 1); { 1 = 00000001 }
Writeln (N shr 2); { 0 = 00000000 }
Рис.110 –
Совместив сдвиг с логическими операциями, можно исследовать отдельные биты слова. Перед вами булева функция TestBit, принимающая два параметра: ARG – число, в котором проверяется состояние некоторого бита, и BIT – номер этого бита. Функция возвращает TRUE, если проверяемый бит содержит единицу, и FALSE в противном случае.
function TestBit (arg: longint; bit : byte): Boolean;
begin
TestBit := (arg and (1 shl bit)) <> 0
end;
Итоги
• Процессоры построены из триггеров. Триггер – это элемент с двумя устойчивыми состояниями, которые можно трактовать либо как булевы значения TRUE и FALSE, либо как числа 0 и 1.
• Для хранения чисел и других данных, триггеры соединены в регистры. Обычно регистр состоит из 8, 16, 32 или 64 битов.
• В Паскале есть средства для работы с регистрами – это логические операции и сдвиги. Они трактуют числа как массивы битов.
А слабо?
А) Напишите программу для исследования операций сдвига (подобную программе «P_48_1»).
Б) Наряду с рассмотренными здесь обычными сдвигами, в процессорах заложены операции циклического (кругового) сдвига. При таком сдвиге (рис. 111) выдвигаемый бит не теряется, а попадает соответственно в младший бит (при сдвиге влево) или в старший бит (при сдвиге вправо).
Рис.111 – Циклический сдвиг влево
В Паскале нет операций циклического сдвига. Напишите функции для циклического сдвига слова влево и вправо. Подсказка: перед сдвигом каждого бита проверяйте состояние теряемого бита, а затем восстанавливайте его в младшем или старшем разряде.
Глава 49
Сложные массивы
Элементом массива может быть любой тип данных, и даже другой массив. Разбор следующих задач убедит вас в этом.
На поклон к Науке
Вернемся в тридевятое царство, история которого ещё далека от завершения. В 38-й главе мы узнали, что для исследования материка запустили спутник, передавший на землю номера границ тамошних стран. А программа, сработанная придворным программистом Ником, нашла по этим данным соседей царства А.