Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / WORD / МУ1 ЛР ЯП.DOC
Скачиваний:
40
Добавлен:
15.04.2015
Размер:
600.06 Кб
Скачать

Поразрядное “не”

X

Not X

0

1

1

0

Поразрядное “и”

X

Y

X and Y

0

0

0

0

1

0

1

0

0

1

1

1

Поразрядное “или”

X

Y

X or Y

0

0

0

0

1

1

1

0

1

1

1

1

Поразрядное “исключающее или”

X

Y

X xor Y

0

0

0

0

1

1

1

0

1

1

1

0

Последняя операция устанавливает результат, равный единице, при несовпадении соответствующих разрядов.

Поразрядный сдвиг вправо и влево достигается применением операций Shl и Shr:

X Shl Y - значение X сдвигается влево на Y разрядов,

X shr Y - значение X сдвигается вправо на Y разрядов.

При выполнении сдвигов мысленная (для выбранного типа ) граница числа (правая или левая) сдвигается на соответствующее число разрядов (вправо или влево):

При сдвиге вправо мысленная правая граница перемещается влево;

При сдвиге влево мысленная левая граница перемещается вправо.

Двоичные разряды числа, которые оказываются за его мысленной границей, отбрасываются. С противоположной направлению сдвига стороны добавляется такое же количество нулей. Исключение составляет случай сдвига влево чисел типов Integer,ShortintиLongint: значение в знаковом разряде, оказываясь за мысленной левой границей числа, не отбрасывается, а циклически восстанавливается опять в знаковом разряде.

Пример.Для числа типа Byteвыполнить операцию7 Shr 2

Было до сдвига = 7 Стало после сдвига =1

0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1

исчезают добавляются

Поразрядные логические операции используются для выполнения следующих действий:

1) выделение двоичного кода, 2) очистка двоичного кода, 3) проверка двоичного кода,

4) инвертирование двоичного кода, 5) занесение единиц в нужные разряды двоичного кода.

Пример.Выделение из двоичного кода нужных разрядов.

Задано следующее объявление двух переменных:

Var

c, w: word;

Выделение из 2байтов переменнойw7младших разрядов происходит так:

Var

c, w: word;

Begin

c := w and $ 7F

маска

Маска формируется следующим образом: нужно поставить в единицу те разряды, которые должны быть выделены.

Пример. Установка в ноль (очистка) нужных разрядов.

Var

c, w: word;

Begin

c := w and $ FF80

где

1111 1111 1000 0000

F F 8 0

В маске нужно установить в единицу все разряды, кроме тех, которые те очищают.

В данном случае будут очищены младшие семь разрядов.

Пример. Проверка заданных разрядов.

Var

c, w: word;

Begin

if (c and маска) = маска

then {если совпало}

Маска формируется следующим образом: в маске все разряды устанавливаются в

ноль, кроме тех, в которых надо проверить наличие единицы.

Пример. Инвертирование нужных разрядов.

Нельзя использовать операцию not, т.к. она является одноместной.

Var

c, w: word;

Begin

c := w xor $7;

Маска формируется следующим образом: в единицу устанавливаются те разряды, которые надо инвертировать (здесь - три младших разряда).

Примечание./ Если операцияxorповторяется два раза, то значение исходного числа восстановится.

ПримерЗанесение1в нужные разряды:

Var

c, w: word;

Begin

c := c or $7;

Маска формируется следующим образом: в единицу устанавливаются те разряды, в которые надо занести единицу. При таком занесении не будут задействованы те разряды, для которых в маске установлен ноль.

ЗАМЕЧАНИЕ. Во всех рассмотренных примерах есть одна особенность: вид маски зависит от разрядности числа. Рассмотрим маску, которая используется в операции очистки, если с ее помощью очистить младшие 7 разрядов в переменной longint, то очистятся 7 младших разрядов и 16 старших разрядов, так как для типа longint маска будет записана как 0000FF80.

Var

c: longint;

Begin

c := c and $FF80;

Вывод: запись маски не должна зависеть от разрядности числа, к которому она применяется.

Для получения семи нулевых младших разрядов надо поступить иначе. Сначала нужно получить число с единицами в младших семи разрядах, а затем проинвертировать его.

Not ($7F)

0111 1111

В общем случае для получения маски из n единиц, начиная с k-го разряда, можно получить следующим образом:

m := not( ( (not 0) shl n) shl (k - n + 1))

будут получены все единицы

справа будут получены n нулей

нули перегоняются на нужную позицию

будет получено n единиц

Соседние файлы в папке WORD