Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binary 2的幂除法和乘法_Binary_Bit Manipulation_Computer Science_Division_Multiplication - Fatal编程技术网

Binary 2的幂除法和乘法

Binary 2的幂除法和乘法,binary,bit-manipulation,computer-science,division,multiplication,Binary,Bit Manipulation,Computer Science,Division,Multiplication,我在一篇论文中读到,将一个数除以2的幂是一个简单的过程。 我在网上搜索了很多解释,但都没有找到。 任何人都能用简单的语言解释一下这到底意味着什么。基本上,将一个数字乘以2的幂,如果这个数字是用二进制表示的,你只需要将所有二进制数字向左或向右翻译: 00100也就是4,如果你想乘以2*2*2,你只需将剩下的数字翻译3次: 100000即32(4*8=32) 另一方面,由于所有数字都存储在二进制中,因此乘法/除法是一种简单的位移位操作 例如(乘法): 5=101(二进制) 5*2=10=1010(

我在一篇论文中读到,将一个数除以2的幂是一个简单的过程。 我在网上搜索了很多解释,但都没有找到。
任何人都能用简单的语言解释一下这到底意味着什么。

基本上,将一个数字乘以2的幂,如果这个数字是用二进制表示的,你只需要将所有二进制数字向左或向右翻译:

00100也就是4,如果你想乘以2*2*2,你只需将剩下的数字翻译3次:

100000即32(4*8=32)


另一方面,由于所有数字都存储在二进制中,因此乘法/除法是一种简单的位移位操作

例如(乘法):

  • 5=101(二进制)
  • 5*2=10=1010(二进制)-将所有位1位置向左移位
  • 5*4=20=10100(二进制)-将所有位2位置向左移位

同样适用于除法(右位移位运算),但如果需要余数,则需要考虑奇数除法的进位。

< P>从位运算的角度看,这是微不足道的。乘以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
int a=123;//或二进制格式:a=0b01111011;
断言(a*2)==(a 1);//2=2^1,(a>>1)=00111101
断言(a*8)==(a*3);//8=2^3,(a>>3)=0000001111
还要注意的是,
a*2=a+a
,根据硬件的不同,加法有时甚至比移位更便宜


对于有符号除法,请注意,在某些语言(如C)中,整数除法向零截断,而算术右移(2的补码在符号位的副本中移位)总是向-无穷大舍入。e、 g.
(-5)/2==-2
,但
(-5)>>1==-3
。实现有符号除以2仍然可以通过移位+额外操作来添加符号位以获得截断行为。(看看C编译器的输出。)

在这种情况下,重要的是,除2(或2的幂)只对整数运算来说是微不足道的。当你谈论浮点除法时,它就变得不那么琐碎了

其原因是,某些数字系统(如二进制、八进制、十六进制等)的基数除法总是可以通过简单的数字右移来完成

例如,在十进制除以10的情况下,您有:

230.0 / 10.0 = 23.00 
(将小数点向左移动一个位置,这将转换为数字的右移)

十六进制数也是如此:

0xA2FF / 0x10 = 0xA2F 
(数字向右移动了一个位置)

二进制数也是一样的:

1101011 / 10 = 110101 (binary notation)
107     /  2 = 53     (decimal notation for the same equation)
如果要除以二的幂,则需要执行的右移次数对应于指数。例如,除以4意味着除以2*2,等于两次右移操作:

1101011 / 100 = 11010 (binary notation, two shift operations)
107     /   4 = 26    (decimal notation)

对于人类来说,这与除以10和乘以10是一样的。你怎么能把任何数字乘以10?只需添加一个零。小心:一旦您尝试在乘法时跟踪溢出或在除法时跟踪余数,它可能不会像您希望的那样简单。二进制浮点格式(例如)可以通过简单地在指数字段中加或减,以2的幂进行乘法或除法!(不过,您必须检查溢出情况)。硬件并不总是将其作为单独的操作提供,因此通常您只需使用常规指令乘以
0.5
。AVX512F有,有,以及相关的浮点和SIMD版本。我想这就是您所说的“不那么琐碎”的意思,而不是“不那么琐碎”,但硬件实现起来非常琐碎。