我在一篇论文中读到,用2的幂除数和乘法是一个微不足道的过程。 我已经搜索了很多互联网的解释但是没有得到它。 任何人都可以用简单的词语解释这实际意味着什么。
答案 0 :(得分:3)
从位操作的角度来看,这是微不足道的。乘以2相当于左移1位,除法是右移。同样,乘以2除以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
,但(-5) >> 1 == -3
。仍然可以通过移位+额外操作来实现带符号除以2,以添加符号位以获得截断行为。 (查看C编译器输出。)
答案 1 :(得分:2)
由于所有数字都以二进制形式存储,因此乘法/除法是一种简单的位移操作。
例如(乘法):
这同样适用于除法(右位移操作),但如果需要余数,则需要考虑奇数除法的进位。
答案 2 :(得分:2)
在这种情况下,重要的是除以2(或2的幂)对于整数运算是微不足道的。当你谈论浮点除法时,它变得不那么微不足道了。
原因是除以某个数字系统的基数(二进制,八进制,十六进制,你的名字)总是可以通过简单的数字右移来完成。
例如,在除以十的十进制系统中,您有:
230.0 / 10.0 = 23.00
(将小数点向左移动一个位置,转换为数字的右移)
十六进制数字相同:
0xA2FF / 0x10 = 0xA2F
(数字向右移一个位置)
二进制数相同:
1101011 / 10 = 110101 (binary notation)
107 / 2 = 53 (decimal notation for the same equation)
如果要除以2的幂,则需要执行的右移数对应于指数。例如,除以4意味着除以2 * 2,等于两个右移操作:
1101011 / 100 = 11010 (binary notation, two shift operations)
107 / 4 = 26 (decimal notation)
答案 3 :(得分:1)
基本上,如果数字以二进制表示,则将数字乘以并除以2,如果数字以二进制表示,则只需要向左或向右翻译所有二进制数字:
<00> 00100即4,如果你想乘2 * 2 * 2你只需将所有数字翻译3次:100000,特别是32(4 * 8 = 32)
以相反的方式将其分开