Java移位运算

[size=medium]
        System.out.println("(byte)0xa7="+(byte)0xa7);
        //结果是:-89.解释:0xa7=0000 0000 0000 0000 0000 0000 1010 0111 ,
        //(byte)0xa7=1010 0111=-89
       
        System.out.println("(byte)(0xa7>>>2)="+(byte)(0xa7>>>2));
        //结果是:41.解释:0xa7>>>2=0000 0000 0000 0000 0000 0000 0010 1001=41,
        //(byte)(0xa7>>>2) = 0010 1001=41
       
        System.out.println("(byte)0xa7>>>2="+((int)((byte)0xa7>>>2)));
        //结果是:1073741801.解释:(byte)0xa7>>>2 = -89>>>2=
        //0011 1111 1111 1111 1111 1111 1110 1001 = 1073741801
        //Java使用补码来表示二进制数,因此移位运算都是针对整型数的二进制补码进行。
       
        System.out.println("(byte)0xa7>>>2="+((byte)((byte)0xa7>>>2)));
        //结果是:-32.解释:(byte)0011 1111 1111 1111 1111 1111 1110 1001=
        //1110 1001=-(0001 0111)=-23
       
        System.out.println(Integer.toBinaryString((byte)0xa7>>>2));
        //结果是:0011 1111 1111 1111 1111 1111 1110 1001

上面是我的分析,不知道是不是正解。
下面是恒叔的分析:
// TODO Auto-generated method stub
  System.out.println((byte)0xa2>>>2);   
  //1073741800
 
  System.out.println(Integer.toHexString((byte)0xa2)); 
  //ffffffa2
  System.out.println(Integer.toHexString((byte)127)); 
  //0000007f
 
  //由于162= (0xa2) 127 = (0x7f) 162大于 127 所以 0xa2转成byte时候溢出
  //变成负数 负数在计算机内存中是补码形式存在 因此就是(byte)0xa2 = 0xffffffa2
  //换算成二进制就是1111 1111 1111 1111 1111 1111 1010 0010
  //不带符号右移2位就是
  //     0011 1111 1111 1111 1111 1111 1110 1000
  //这个时候0011 1111 1111 1111 1111 1111 1110 1000的最高位就不是1 是0 了 表示正数了
  //然后你再把0011 1111 1111 1111 1111 1111 1110 1000变成十进制是多少 是不是 1073741800

注明:int = 4byte = 32bit
      float = 4byte = 32bit
      long = 8byte = 64bit
      double = 8byte=64bit
      short = 2byte = 16bit
      char = 2byte = 16bit
      byte = 8bit

你可能感兴趣的:(java)