int -1--->11111.....111(32个1,四字节)无符号右移10位即得00000000001111....111(22个1)即十进制4194303
同样long -1是64个1无符号右移10位即得00000000001111....111(54个1)即十进制18014398509481983其他的,请看下面thinking in java中的一段话:
对char,byte或者short进行移位处理,那么在移位进行之前会自动转换成int。只有右侧的5个低位才会用到。这样可防止在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java 1.0和Java 1.1特别突出)。它们会自动转换成int类型,并进行右移位。但“零填充”不会发生,所以在那些情况下会得到-1的结果。

解决方案 »

  1.   

    以上问题根本原因在于Java使用补码来表示二进制数和在使用>>>操作符是存在数据转换。
      
    1 Java使用补码来表示二进制数,所以会出现4194303,18014398509481983的结果  在补码表示中,最高位为符号位,正数的符号位为0,负数为1。补码的规定如下:对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为00101010。对负数而 言,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。如-42的补码为1010110 (00101010 按位取反11010101+1=11010110)  用补码来表示数,0的补码是唯一的,都为00000000。(而在原码,反码表示中,+0和-0的表示是不唯一的,可参见相应的书籍)。2  s >>>=10 存在数据转化,其可理解为 s=(short)(((int)s)>>>10),这是为何出现-1结果的原因
      

  2.   

    我备考scjp的时候做了一个程序来帮我理解位运算符的含义。也许可以帮到你。http://www.blogbus.com/blogbus/blog/userfiles/15952/1087961530.zip运行的时候用javaw就可以了。或者把这个文件的后缀改成jar
      

  3.   

    那个程序不能于运行啊,显示说找不到MAIN函数?怎么回事呢?
      

  4.   

    哦明白了,原来-1在JAVA里是用补码表示,怪不得,害我郁闷了好久
      

  5.   

    javaw -jar 1087961530.zip
    可以运行阿。
      

  6.   

    原来要加-JAR参数啊,我对命令行参数还不太清楚呵呵,谢谢了!