ste*_*tex 4 c
我试图找到一种方法来将整数值与负值相乘,只是位移.
通常我通过使用最接近我的因子的2的幂进行移位并且仅添加/减去其余部分,例如 x * 7 = ((x << 3) - x)
x * 7 = ((x << 3) - x)
假设我想计算x * -112.我能想象的唯一方法是-((x << 7) - (x << 4),计算x * 112并在之后否定它.
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.
(~((x << 7) - (x << 4))) + 1
如果我们比算术运算(特别是乘法)更快地考虑按位运算并忽略编译器优化,则不一定更漂亮,但速度更快.
不是说我应该这样做,因为你不应该这样做.虽然知道这件事很好.
归档时间:
15 年,10 月 前
查看次数:
5431 次
最近记录: