Сдвиг влево в дополнении и умножении до 2

Я реализую простое (виртуальное) АЛУ и некоторые другие микросхемы (сумматор, умножитель и т.д.).

Я использую представление дополнения 2 для своих чисел.

Для умножения x и y, двух 16-битных чисел, я подумал, что буду использовать сдвиги влево в этих строках (это, конечно, выполняется без фактического цикла):

  • установить сумму[0..15]=0

  • установить х'=х

  • для i=0...15 //(y[0] — младший бит, а y[15] — старший бит)

    • add x' to sum if y[i]=1 and shift x' left.

(Это стандартный способ?)

Моя проблема с левыми сдвигами:

Если есть я с.т. x[i]=1, в какой-то момент старший бит x' станет равным 1, и это отрицает его.

Это проблема, поскольку, например, 2 * 2 с использованием вышеописанного метода дает «-4».

Итак, мой фактический вопрос: при сдвиге влево мне также нужно учитывать бит знака?


person Paz    schedule 21.02.2014    source источник


Ответы (1)


Да, вы делаете.

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

person 500 - Internal Server Error    schedule 21.02.2014
comment
Таким образом, сдвиг влево 0110 0000 0000 0000 должен произвести: 0100 0000 0000 0000? и разве недостаточно сохранить знак, сдвинуть, а затем заменить текущий бит знака на исходный? - person Paz; 21.02.2014
comment
Это условие переполнения, но да. -- Нет, вы должны преобразовать знак с помощью NEG или подобного. В дополнении до двух -1 представляется как все единицы и так далее. - person 500 - Internal Server Error; 21.02.2014