我在一篇论文中读到,数字除以 2 的幂并乘以 2 的幂是一个微不足道的过程。
我在互联网上搜索了很多解释,但没有得到它。
任何人都可以用简单的语言解释一下这实际上意味着什么。
从位操作的角度来看,这是微不足道的。乘以2相当于左移1位,除法相当于右移。类似地,乘以或除以 2 的任意次方也是同样简单的事情。
int a = 123; // or in binary format: a = 0b01111011;
assert (a * 2) == (a << 1); // 2 = 2^1, (a << 1) = 11110110
assert (a / 2) == (a >> 1); // 2 = 2^1, (a >> 1) = 00111101
assert (a * 8) == (a << 3); // 8 = 2^3, (a << 3) = 1111011000
assert (a / 8) == (a >> 3); // 8 = 2^3, (a >> 3) = 0000001111
另请注意a*2 = a+a
,并且有时加法甚至比移位更便宜,具体取决于硬件。
对于有符号除法,请注意在某些语言(例如 C)中,整数除法会向零截断,而算术右移(在 2 的补码的符号位副本中移位)始终向 -Infinity 舍入。例如(-5)/2 == -2
, but (-5) >> 1 == -3
。实现有符号除以 2 仍然可以通过移位 + 额外操作来添加符号位以获得截断行为。 (查看 C 编译器输出。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)