Операция сдвига влево с двоичным дополнением Единиц - PullRequest
0 голосов
/ 16 апреля 2019

Я занимаюсь исследованием побитовой операции и числовых представлений со знаком.Я признал, что если мы сделаем левый сдвиг на схеме дополнения.Неправильно умножается исходное число.

Например (дополнение к единице):

11100101 (-26) << 1 = 11001010 (-53)

11110100 (-11) << 2 = 11010000 (-47)

-26 Сдвиг влево 1 бит дает -53 (не -52), -11 слевасдвиг 2 бита дает -47 (не -44).Так вот почему люди выбирают два дополнения для точной числовой операции.Я искал в Google, но ни одного поста не упомянул о сдвиге влево и его дополнении.Почти упомянутое смещение влево с добавлением двух

1 Ответ

2 голосов
/ 16 апреля 2019

В дополнении к двум отрицательное число A кодируется положительным числом 2 n - | A | и можно найти его значение по -2 n-1 & times; a n-1 + ∑ 0 n-2 2 i & times; a i Легко показать, что сдвиг этого значения влево на k битов даст код A & times; 2 k , при условии, что переполнения нет (т.е. только нули или только единицы сместился).

В дополнение к одному отрицательное число A кодируется (дополнение 2 к A) -1. Его значение составляет -2 n-1 & times; a n-1 + ∑ 0 n-2 2 i & times; а я -1. Если мы сместим его влево на k, числовое значение результата будет равно (дополнение 2 к 2 k * A) -2 k * 1 (при условии, что переполнения нет). Он отличается на 2 k -1 от ожидаемого результата, который будет (2-х дополнения 2 k * A) -1

Мы можем проверить это на ваших примерах:

* * С1 тысяча сорок три (-26) << 1 = -53 (= - 52- (2 <sup>1 -1)) * * одна тысяча сорок шесть С1 (-11) << 2 = -47 (= - 44- (2 <sup>2 * * 1 048 -1))

Таким образом, чтобы умножить отрицательное число, закодированное в дополнении 1, на 2 k , вам нужно сдвинуть его влево на k и добавить к своему результату 2 k -1

Как правило, только два дополнения дают простые арифметические операции. Другие коды (превышение k, дополнение, знак абсолютного значения) всегда требуют исправления (и это причина, по которой они используются очень редко).

...