仅通过移位乘以负整数

ste*_*tex 4 c

我试图找到一种方法来将整数值与负值相乘,只是位移.

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

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

有没有"更漂亮"的方式来做到这一点?

Pup*_*ppy 7

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


IVl*_*lad 7

2的补码中的正数的负数是通过否定所有位然后在结果中加1来完成的.例如,要从4获得-4,您将执行以下操作:

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

同样反转标志.

所以你可以这样做:

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

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

不是说我应该这样做,因为你不应该这样做.虽然知道这件事很好.