嘿,我正在自学按位,我在互联网的某个地方看到了算术移位(>>)一个数字的二分之一。我想测试它:
44 >> 1 returns 22, ok
22 >> 1 returns 11, ok
11 >> 1 returns 5, and not 5.5, why?
另一个例子:
255 >> 1 returns 127
127 >> 1 returns 63 and not 63.5, why?
谢谢。
位移运算符实际上并不除以 2。相反,它将数字的位向右移动右侧给出的位置数。例如:
00101100 = 44
00010110 = 44 >> 1 = 22
请注意第二行中的位与上面的行相同,只是向右移动了一位。现在看第二个例子:
00001011 = 11
00000101 = 11 >> 1 = 5
这与之前的操作完全相同。但是,5的结果是由于最后一位右移消失了,产生了结果5。由于这种行为,右移运算符一般会等价于除以2然后扔掉任何余数或小数部分。
二进制的11是1011
11 >> 1
意味着您将二进制表示向右移动一步。
1011 >> 1 = 101
然后你有 101 二进制,即 1*1 + 0*2 + 1*4 = 5。
如果你这样做了11 >> 2
,你将得到二进制的 10,即 2 (1*2 + 0*1)。
向右移动 1 将 sum(A_i*2^i) [i=0..n] 转换为 sum(A_(i+1)*2^i) [i=0..n-1] 这就是为什么如果你的数字是偶数(即 A_0 = 0)它被二除。(对不起自定义的 LateX 语法...... :))
二进制没有十进制数的概念。它返回截断的(int)值。
11 = 1011 二进制。向右移动,你有 101,即十进制的 5。
In most statically-typed languages, the return type of the operation is e.g. "int". This precludes a fractional result, much like integer division.
(There are better answers about what's 'under the hood', but you don't need to understand those to grok the basics of the type system.)
位移与除或乘以 2^n 相同。在整数算术中,结果会朝零四舍五入为整数。在浮点算术中,不允许移位。
内部位移,嗯,位移位,舍入只是意味着从边缘脱落的位只是被移除(并不是说它实际上会计算精确值然后舍入它)。对于右侧和正值,出现在相反边缘上的新位始终为零。对于负值,在左侧附加一位,以便该值保持负数(请参阅二进制补码的工作原理)并且我使用的算术定义仍然适用。