Умножение на константы, где позиция бита является самым старшим битом - PullRequest
0 голосов
/ 18 июня 2020

Я читал знаменитую книгу «Компьютерные системы: взгляд программиста» и заблудился в умножении на константы. В книге говорится:

целочисленное умножение намного дороже, чем сдвиг и сложение, многие компиляторы C пытаются удалить множество случаев, когда целое число умножается на константу с комбинациями сдвига, сложения и вычитания. Например, предположим, что программа содержит выражение x * 14. Понимая, что 14 можно записать как 1101, компилятор может переписать умножение как (x<<3) + (x<<2) + (x<<1). И мы можем вычислить влияние этих битов на продукт, используя любую из двух разных форм:

enter image description here

, а также говорится, что мы можем изменить выражение для формы B для случая, когда позиция бита n является наиболее значимым битом как:

-(x<<m)

, поскольку в форме B указано, что мы должны вычислить (x<<w) - (x<<m), но сдвиг x влево на w даст значение 0.

Я так запуталась, что это на самом деле значит? Допустим, мы хотим умножить x на 12 (1100), так как старший бит равен 1, тогда его можно упростить как - (x<<2), где m в данном случае равно 2, но как это возможно? если x - беззнаковое число, то мы умножаем его на 12, как тогда мы можем получить отрицательное число?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...