仅通过移位乘以负整数

时间:2010-05-01 21:22:00

标签: c

我正试图找到一种方法,只需将位移一个整数值与负值相乘。

通常我通过使用最接近我的因子的2的幂来移动并且仅添加/减去其余部分,例如x * 7 = ((x << 3) - x)

假设我想计算x * -112。我能想象的唯一方法是-((x << 7) - (x << 4),所以要计算x * 112并在之后否定它。

有没有“更漂亮”的方法呢?

3 个答案:

答案 0 :(得分:7)

让编译器执行此操作,然后检查生成的程序集。

答案 1 :(得分:7)

2's complement中正数的负数是通过否定所有位然后在结果中加1来完成的。例如,要从4获得-4,你会这样做:

4 = 000...0100 in binary. ~4 = 111...1011. -4 = 111...1100.

与反转标志相同。

所以你可以这样做:

(~((x << 7) - (x << 4))) + 1

如果我们考虑按位运算比算术运算(尤其是乘法)更快并且忽略编译器优化,则不一定更漂亮,但速度更快。

不是说我应该这样做,因为你不应该这样做。虽然知道它很好。

答案 2 :(得分:0)

计算机内部代表two's compliment form中的负整数。两个恭维算术的一个很好的特性是multiply negative numbers就像乘以正数一样。因此,find the two's complement并使用您的常规方法。

这是一个简单的例子。为了便于说明,我将使用8位整数乘以-15。

十六进制中的15是0x0f。这两个对0x0f的称赞是0xf1。

由于这些是8位整数,所有算术都是mod 0xff。特别要注意的是0x100 * anything = 0。

x * 0xf1
= x * (0x100 - 0x10 + 0x01)
= -(x * 0x10) + x
= -(x << 4) + x