Bitshift乘以任意数字

时间:2011-09-02 16:07:06

标签: c bit-manipulation

仅使用加,减和位移,如何将整数乘以给定数?

例如,我想将整数乘以17。

我知道向左移动乘以2的倍数,向右移动除以2的幂,但我不知道如何推广。


负数怎么样?转换为二进制补码并执行相同的过程?

编辑:好的,我得到了这个,没关系。你转换成两个补码,然后按照从左到右而不是从右到左的数字进行转换。)


现在棘手的部分进来了。我们只能使用3个运营商。

例如,乘以60我可以通过使用它来完成:

(x << 5) + (x << 4) + (x << 3) + (x << 2)

x是我乘以的数字。但这是7个运营商 - 我怎么能将其浓缩为仅使用3个?

4 个答案:

答案 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)