我正试图找到一种方法,只需将位移一个整数值与负值相乘。
通常我通过使用最接近我的因子的2的幂来移动并且仅添加/减去其余部分,例如x * 7 = ((x << 3) - x)
假设我想计算x * -112
。我能想象的唯一方法是-((x << 7) - (x << 4)
,所以要计算x * 112
并在之后否定它。
有没有“更漂亮”的方法呢?
答案 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