byte base = (byte)((byte)0xff >>> 2);
System.out.println("b = " + base);
System.out.println("b = " + Integer.toBinaryString(base));
/**
* 结果:
* b = -1
* b = 11111111111111111111111111111111
*/
byte base2 = (byte)(0xff >>> 2);
System.out.println("b2 = " + base2);
System.out.println("b2 = " + Integer.toBinaryString(base2));
/**
* 结果:
* b2 = 63
* b2 = 111111
*/
求大神详解
byte base = (byte)((byte)0xff >>> 2);这条语句实际执行过程是:
1 (byte)0xff
把int型整数0xff(用2进制表示为 00000000 00000000 00000000 11111111)强制转换成byte型的,截取后8位。用2进制表示是 11111111,因为java都是有符号数,这个数的值是-1.
2 (byte)0xff >>> 2
执行右移2位操作。
因为java的移位操作只针对int型,所以这时要进行默认的类型转换,把byte型的-1 转成int型的-1,这个int型-1,用2进制表示是11111111 11111111 11111111 11111111,因为>>>操作左边空位补零,执行完操作后,这个数是 00111111 11111111 11111111 11111111,其值是1073741823。
3 (byte)((byte)0xff >>> 2)
再次做类型转换,截取后8位。转换后的2进制为 11111111,其值是 -1。Integer.toBinaryString(base) 这个方法要求的参数为int型,所以在执行的时候还是进行了类型转换,把byte型-1 转成int型-1,就是看到的那个结果。
11111111>>>2 --> 00111111 byte base = (byte)((byte)0xff >> 2);右移,带符号 ,则原来符号位(最高位),前面补符号位
11111111>>2 --> 11111111