书上说:对于int型整数a,a>>33和a>>1结果是一样的,我不明白!书上还说:a>>32的结果还是a原来的数字。经事实验证,确实是这样,可是书上是这样说的:对Java来说,有符号的数据(Java语言中没有无符号的数据类型)用“>>”移位时,如果最高位是0,左边移空的高位就填入0,如果最高位是1,左边移空的高位就填入1。所以我就不明白了,希望有明白的师兄能给予指导,谢谢啦!!

解决方案 »

  1.   

        java 规范规定,对于int型整数,只使用右边的操作数其低5位,。33的2进制形式是00100001,其低5位就是00001,其他位通过&0x1f清零。最后就是a>>33,实际上就是a>>1. 
        对于long型整数的移位,使用右边操作数的低6位。
    可以参看java 语言规范 15.19 shift operators.
      

  2.   

    If the promoted type of the left-hand operand is int, only the five lowest-order bits
    of the right-hand operand are used as the shift distance. It is as if the right-hand
    operand were subjected to a bitwise logical AND operator & (§15.22.1) with the
    mask value 0x1f (0b11111). The shift distance actually used is therefore always in
    the range 0 to 31, inclusive.
    If the promoted type of the left-hand operand is long, then only the six lowestorder
    bits of the right-hand operand are used as the shift distance. It is as if the
    right-hand operand were subjected to a bitwise logical AND operator & (§15.22.1)
    with the mask value 0x3f (0b111111). The shift distance actually used is therefore
    always in the range 0 to 63, inclusive.
      

  3.   

    因为int型是32位  所以移动33和移动1的结果是一样,这应该很容易理解的。而“ 有符号的数据(Java语言中没有无符号的数据类型)用“>>”移位时,如果最高位是0,左边移空的高位就填入0,如果最高位是1,左边移空的高位就填入1。”这个你所说的最高位应该是指符号位,0表示正数,1表示负数。对于正数补0,为什么负数补1的理解应该是这样的:数据的存储都是以补码的形式存在的,而正数的补码和原码是相同的,对于负数来说,符号位不变,补码=反码+1;这就能够理解为什么负数它填充的就是1了 因为它还原成我们所看到的原码的时候就成了所谓的 “0”了; 不知道对你是否有帮助呢?
      

  4.   

    a>>b 当a是int类型的时候,b就是其移动的位数,当b大于32的时候,会自动 b= b%32,然后再进行以为操作!
      

  5.   

    位运算不解释- - 这个和java语言本身无关,是计算机数据存储方式的一种基本运算方式,在学java之前应该知道这种知识的,它是数据结构里面的内容。
    现在很多学编程开发的,特别是学JAVA和C#的一票人,很多计算机基础都不知道就开始开工,真是让人无语,这也太民工化了。
      

  6.   

    java 规范规定,对于int型整数,只使用右边的操作数其低5位,。33的2进制形式是00100001,其低5位就是00001,其他位通过&0x1f清零。最后就是a>>33,实际上就是a>>1.  
      对于long型整数的移位,使用右边操作数的低6位。====好像有道理
      

  7.   

    http://www.ticmy.com/?p=46
      

  8.   

    有本书叫"深入理解计算机系统"建议lz去看下。我劝lz别纠结这个问题,这个东西应该是和jvm底层实现有关。在c语言下,超过位长的位移运算,由编译器解释,不同的编译器得到的结果不一定相同。