import java.util.*;
public class a
{
public static void main(String[] args)
{
byte a = -1;
for (int i = 1;i < 32 ;++i )
{
byte b = (byte)(a >>> i);
a >>>= i;
System.out.println("i=" + i);
System.out.println(Integer.toBinaryString(a)); //输出A
System.out.println(Integer.toBinaryString(a >>> i)); //输出B
}
}
}上面这段代码中,前24次循环输出A总是输出32个1,而输出B依次输出从32个1到8个1,第25次循环输出A输出7个1,输出B输出0,之后所有的循环两个输出都是0.如果>>>操作符是先扩充成32位的int,再移位的话,那么输出A第26次循环应该输出6个1,而输出B为什么从第25次循环开始就输出0?
求高人解答java移位操作符的具体过程。

解决方案 »

  1.   

    java移位问题,其实是这样的32位的,
    i>>j实质为i>>(j%32),这样 33>>32=33*(32%32)=0
    三个>>>是无符号整型的移位
      

  2.   

    重点在于语句
    a >>>= i;
    因为a是byte,8位长,>>>运算之前会扩展到32位全1,位移后,截断得到低8位为结果值写回到a中。
    前24次,位移都没能到达低8位,故a >>>= i之后a的值依然是-1。
    第25次,位移到达低字节的最高位,是的a位移后的值为01111111,从此不再是全1的-1值了。
    之后所有的运算,包括输出B在第25次循环的时候,a位移前扩展为32位时,前面扩充的是0不是1了,因为a已经是正数了,因而后面每次都得到全0
      

  3.   

    了解了,谢谢楼上各位的回复,这几天我刚开始自学JAVA,看到Thingking in Java上的移位,写代码写晕头了把两个用来测试的代码混到一起了,怪不得百思不得其解。