为什么算术移位仅在某些事件中变为一半?

时间:2010-02-25 16:00:56

标签: c# bit-shift

嘿,我正在自我学习关于按位,我在互联网上看到算术移位(>>)一半的数字。我想测试一下:

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?

感谢。

5 个答案:

答案 0 :(得分:13)

位移运算符实际上没有除以2.相反,它将数字的位向右移动右侧给出的位置数。例如:

00101100 = 44
00010110 = 44 >> 1 = 22

注意第二行中的位如何与上面的行相同 向右移了一个地方。现在看第二个例子:

00001011 = 11
00000101 = 11 >> 1 = 5

这与以前的操作完全相同。然而,5的结果是由于最后一位向右移动并消失,产生结果5.由于这种行为,右移操作符通常相当于除以2然后扔掉任何余数或小数部分。

答案 1 :(得分: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转换求和(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”。这排除了分数结果,就像整数除法一样。

(关于什么是'幕后'有更好的答案,但你不需要了解那些以了解类型系统的基础知识。)