嘿,我正在自我学习关于按位,我在互联网上看到算术移位(>>)一半的数字。我想测试一下:
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?
感谢。
答案 0 :(得分:13)
位移运算符实际上没有除以2.相反,它将数字的位向右移动右侧给出的位置数。例如:
00101100 = 44
00010110 = 44 >> 1 = 22
注意第二行中的位如何与上面的行相同 向右移了一个地方。现在看第二个例子:
00001011 = 11
00000101 = 11 >> 1 = 5
这与以前的操作完全相同。然而,5的结果是由于最后一位向右移动并消失,产生结果5.由于这种行为,右移操作符通常相当于除以2然后扔掉任何余数或小数部分。
答案 1 :(得分:2)
11 >> 1
表示您将二进制表示向右移动一步。
1011 >> 1 = 101
然后你有二进制101,即1 * 1 + 0 * 2 + 1 * 4 = 5
如果你已经完成了11 >> 2
,你将得到10个二进制数,即2(1 * 2 + 0 * 1)。
向右移动1转换求和(A_i * 2 ^ i)[i = 0..n]总和(A_(i + 1)* 2 ^ i)[i = 0..n-1] 这就是为什么如果你的数字是偶数(即A_0 = 0),它除以2。 (抱歉定制的LateX语法......:))
答案 2 :(得分:1)
二进制没有十进制数的概念。它返回截断的(int)值。
11 = 1011二进制。向右移动,你有101,这是十进制的5。
答案 3 :(得分:0)
位移与除法或乘以2 ^ n相同。在整数算术中,结果向零舍入为整数。在浮点算术中,不允许位移。
内部位移,好吧,移位,并且舍入仅仅意味着从边缘掉落的位简单地被移除(不是它实际上计算精确值然后将其四舍五入)。出现在相对边缘的新位始终为右侧的零和正值。对于负值,左侧会附加一个位,因此该值保持为负(请参阅two's complement如何工作),并且我使用的算术定义仍然适用。
答案 4 :(得分:0)
在大多数静态类型的语言中,操作的返回类型是例如。 “INT”。这排除了分数结果,就像整数除法一样。
(关于什么是'幕后'有更好的答案,但你不需要了解那些以了解类型系统的基础知识。)