仅使用加,减和位移,如何将整数乘以给定数?
例如,我想将整数乘以17。
我知道向左移动乘以2的倍数,向右移动除以2的幂,但我不知道如何推广。
负数怎么样?转换为二进制补码并执行相同的过程?
(编辑:好的,我得到了这个,没关系。你转换成两个补码,然后按照从左到右而不是从右到左的数字进行转换。)
现在棘手的部分进来了。我们只能使用3个运营商。
例如,乘以60我可以通过使用它来完成:
(x << 5) + (x << 4) + (x << 3) + (x << 2)
x
是我乘以的数字。但这是7个运营商 - 我怎么能将其浓缩为仅使用3个?
答案 0 :(得分:12)
它叫做shift-and-add。维基百科对此有一个很好的解释:
http://en.wikipedia.org/wiki/Multiplication_algorithm#Shift_and_add
编辑: 要回答你的另一个问题,是的,转换为两个赞美是有效的。但是你需要签名延长它以保持整个产品。 (假设这就是你想要的)
EDIT2: 如果两个操作数都是负数,那么从一开始就只有两个操作符补充它们,你不必担心这个。
答案 1 :(得分:6)
以下是乘以3的示例:
unsigned int y = (x << 1) + (x << 0);
(我假设x
也是unsigned
)。
希望你能够概括一下。
答案 2 :(得分:4)
17 = 16 + 1 =(2 ^ 4)+(2 ^ 0)。因此,将您的数字向左移4位(乘以2 ^ 4 = 16),并将原始数字添加到其中。
另一种看待它的方法是:17是二进制(基数2)中的10001,因此您需要对乘法器中设置的每个位(即位4和0,如上所述)进行移位操作。
我不知道C,所以我不会通过提供代码来使自己难堪。
答案 3 :(得分:3)
据我所知,一般只使用3个运算符就没有简单的方法。
可以乘以60,因为60 = 64 - 4:(x << 6) - (x << 2)