Операции сдвига
Контроль логических операций
К логическим операциям относятся операции сдвига, логического сложения и умножения, выполняемые по соответствующим правилам.
Несмотря на кажущуюся простоту этих правил, осуществление операций контроля сталкивается с рядом трудностей, объясняемых тем, что логические операции являются поразрядными операциями.
Пусть задано число А = апап-1 ...а1а0, имеющее контрольный код rа = аks...аk1.
Обозначим код числа А, сдвинутый влево, через (без циклического переноса) и
(с циклическим переносом) (при сдвиге вправо стрелка в обозначении будет повернута направо). Соответствующим образом обозначим и контрольный код:
;
;
;
.
Cдвиг влево двоичного числа эквивалентен умножению на два. Так как при сдвиге числа происходит потеря некоторых его разрядов, можно предполагать, что контрольный код сдвинутого числа изменится на величину Δ:
,
где — сдвинутый влево контрольный код.
Величина Δ зависит от значений аn и аks,которые при сдвиге выходят за пределы разрядной сетки.
Если при сдвиге n-разрядного числа старшая единица выйдет за пределы разрядной сетки, то это эквивалентно вычитанию единиц из контрольного кода сдвинутого числа [
— вес (n+ 1)-го разряда].
Если при сдвиге контрольного кода выходит за пределы разрядной сетки разряд аks = 1, то это эквивалентно уменьшению контрольного кода на 2S. Такую потерю надо восстановить прибавлением к контрольному коду единицы.
В общем случае предыдущее уравнение принимает вид
.
Веса разрядов кодовой комбинации, представленной в системе с основанием 2S, назначаются следующим образом:
s=3 | an | an-1 | an-2 | an-3…a3 | a2 | a2 |
Вес σ | 22 | 21 | 20 | 22…22 | 21 | 20 |
В результате значения поправок Δ для контроля выполнения левого сдвига по модулю будут:
Значение an …. | ||||
Значение aks …. | ||||
Поправка Δ…. | -1 | +1 |
Значение поправки Δ можно заменить ее дополнением до модуля.
Для выполнения сдвига влево с циклическим переносом из старшего разряда в младший разряд необходимо уменьшить контрольный код на величину ; так как
=1, этот член равен 0. Следовательно, предыдущая формула примет вид
.
При сдвиге вправо происходит потеря младших разрядов числа и контрольного кода этого числа. Так как сдвиг вправо эквивалентен делению на 2, то
;
.
Эти потери надо компенсировать. Значит, контрольный код сдвинутого вправо числа можно найти по формуле
.
В зависимости от модуля поправка к контрольному коду в случае простого сдвига принимает следующие значения:
Значение a1 …. | ||||
Значение ak1 …. | ||||
Поправка Δ для: | ||||
p = 3…. | ||||
p = 7.… |
При модифицированном сдвиге вправо, который выполняется по правилу A = 1, an-1, an-2…a2a1; = 1, an-1…a3a2, происходит также потеря младших разрядов кодовой комбинации числа и контрольного кода. Для этого случая предыдущая формула сохраняет свой вид, но поправки должны быть следующими:
Значение a1 …. | ||||
Значение ak1 …. | ||||
Поправка ΔM для: | ||||
p = 3…. | ||||
p = 7.… |