В дополнении к двум отрицательное число 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, дополнение, знак абсолютного значения) всегда требуют исправления (и это причина, по которой они используются очень редко).