class ee
{
 public static void main(String[] args)
 {
  int x=0x80000000;
  int y=0x80000000;
  int a=15;
  int b=15;
  int c=31;
  int d=31;
  int e=15;
  a=a>>1;
  b=a>>>1;
  x=x>>1;
  y=y>>>1;
  System.out.println("0x80000000>>1="+Integer.toHexString(x));
  System.out.println("0x80000000>>>1="+Integer.toHexString(y));
  System.out.println("*****************");
  System.out.println("15>>1="+Integer.toBinaryString(a));
  System.out.println("15>>>1="+Integer.toBinaryString(b));
  System.out.println("*****************");
  System.out.println("31>>1="+Integer.toBinaryString(c));
  System.out.println("31>>>1="+Integer.toBinaryString(d));
  System.out.println("e="+Integer.toBinaryString(e));
 }
}
运行结果是
0x80000000>>1=c0000000
0x80000000>>>1=40000000
*****************
15>>1=111
15>>>1=11
*****************
31>>1=11111
31>>>1=11111
e=1111
可是为什么"15>>1=111 15>>>1=11"而不是"15>>1=1111 15>>>1=0111"

解决方案 »

  1.   

        a=a> > 1;
        b=a> > > 1;
    下面那一据写错了
    应该是b=b>>>1;
      

  2.   

    15是一个正数所以>>的效果和>>>的效果是一样的
      

  3.   

    “<<”, “>>”, “>>>”在Java中是左移、有符号右移和无符号右移运算符。位移运算符只对int值进行操作,如果不是int,编译器会报错。在Java中,一个int的长度始终是32bit,也就是4个字节。比如t>>>n的含义就是把整数t右移n位,高位补上零。所以如果t是个负数,最高位是1,那么经过无符号右移之后,就成了一个正数。比如 -1>>>31=1。值得注意的是,虚拟机在进行位移操作之前,把位移的位数(即“t>>>n”中的n)对32取了模,左移或右移33位等价于移动1位,而且无论任何数,使其移动32位,其值都不会发生变化。因为在虚拟机看来,t>>>32与t>>>0是等价的(同理t<<32等价于t<<0)。移动64位也是如此,以此类推。那如果移动的位数 n 是负数怎么办呢?。
    这时虚拟机会先让n对32取模,变成一个绝对值小于32的负数,然后再加上32,直到 n 变成一个正数。比如(k>>>-1) ==> (k>>>31); (k>>-43) ==> (k>>-11) ==> (k>>>21)。
    请参考……
      

  4.   

    没有啊,除了int之外,byte、short、char、long都可以使用移位运算符的啊。