除以2的幂乘除

时间:2014-09-11 12:35:28

标签: binary bit-manipulation computer-science division multiplication

我在一篇论文中读到,用2的幂除数和乘法是一个微不足道的过程。 我已经搜索了很多互联网的解释但是没有得到它。 任何人都可以用简单的词语解释这实际意味着什么。

4 个答案:

答案 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)

由于所有数字都以二进制形式存储,因此乘法/除法是一种简单的位移操作。

例如(乘法):

  • 5 = 101(二进制)
  • 5 * 2 = 10 = 1010(二进制) - 只是将所有位1向左移位
  • 5 * 4 = 20 = 10100(二进制) - 只是将所有位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)

以相反的方式将其分开