代码之家  ›  专栏  ›  技术社区  ›  Alon Gubkin

为什么算术移位只有在某些情况下才是半个数?

  •  7
  • Alon Gubkin  · 技术社区  · 15 年前

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

    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 回复  |  直到 15 年前
        1
  •  13
  •   JSBÕ±Õ¸Õ£Õ¹    15 年前

    位移位运算符实际上不除以2。相反,它将数字的位移到右边,移到右边指定的位置。例如:

    00101100 = 44
    00010110 = 44 >> 1 = 22
    

    注意第二行中的位与上面的行是如何相同的,只是 向右移动一个位置。现在看第二个例子:

    00001011 = 11
    00000101 = 11 >> 1 = 5
    

    这和以前完全一样。然而,5的结果是由于最后一位右移并消失,从而产生结果5。由于这种行为,右移位运算符通常相当于除以2,然后丢弃任何余数或小数部分。

        2
  •  2
  •   pierroz    15 年前

    二进制的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),它是除以2。(很抱歉自定义的乳胶语法…:)

        3
  •  1
  •   Michael Pardo    15 年前

    二进制没有十进制数的概念。它返回截断的(int)值。

    11=1011二进制。右移就有101,十进制是5。

        4
  •  0
  •   Tronic    15 年前

    位移位与2^n的除法或乘法相同。在整数运算中,结果向零舍入为整数。在浮点运算中,不允许位移位。

    内部位移位,好吧,移位位,舍入仅仅意味着从边上掉下来的位简单地被移除(并不是说它实际上会计算精确的值,然后对其进行舍入)。出现在对边上的新位对于右侧和正值始终为零。对于负值,将在左侧附加一个位,以便该值保持为负值(请参见如何 two's complement 我使用的算术定义仍然是正确的。

        5
  •  0
  •   Brian    15 年前

    在大多数静态类型语言中,操作的返回类型是例如“int”。这就排除了分数结果,就像整数除法一样。

    (关于什么是“隐藏”有更好的答案,但您不需要了解这些就可以了解类型系统的基本知识。)