假设:
byte b = (byte)0xF1 ;
那么 System.out.println(b)的结果是 -15 。
我的理由是,1111 0001 ,高位是符号位,所以取反加1等于-15,正确!
-------------------
问题1:
同样的方法,一下却不行了!
byte b = (byte)0xF1 ;
System.out.println(b>>4) ;
依照我上面的理解,应该是 1111 0001 >> 4 == 0000 1111 == 15 !
但是,答案却是 -1 ?
---------------------------------
我想不太明白,求解释 。
【望详细解释,谢谢!】
------解决方案--------------------
右移(>>):
对于正数,右移n位就相当于除以2的n次方;
对于负数,右移n位就相当于除以2的n次方然后减1;
结果是:-15/16-1
------解决方案--------------------
>> 带符号右移,高位补充符号,1111 0001 >>4=1111 1111 = -1 右移有逻辑右移和算术右移
------解决方案--------------------
最高位的符号位页会左移,左移4位就变成了11111111,当然是-1阿
------解决方案--------------------
1111 0001 右移4位为1111 1111,取反为0000 0000,加1为0000 0001,其中高位表符号,所以为-1,没错。
ps:右移操作移位方法
各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
貌似这儿就是补符号位。
------解决方案--------------------
>>是带符号的右移,这里符号是1,所以右移时左边是置1,而不是0,如果>>>就是00001111了
------解决方案--------------------
public static void main(String[] args)
{
byte b = (byte)0xF1 ;
//1.
System.out.println(b >>> 4);
//2.
System.out.println(b >>> 28);
//3.将扩大后的高24bit置为0吧
System.out.println(((b & 0xFF) >>> 4));
//4.既然知道了是8bit那就右移后直接去低4位
System.out.println(b >> 4 & 0x0F);
}
楼上的各位已经解释了 >>与>>>的区别了 以上代码除了1不能正常输出15外其余都可以 我也一直没想明白一旦byte溢出 Java为什么会将其扩大成int类型
------解决方案--------------------
关于左移,右移的操作方法:
对于byte类型的数据,右移时,要看高位,如果高位是1,右移时高位应该补1,如果高位是0,就应该补0;左移时低位均要补0。
对于符号>>和>>>这个的区别在于,不论高位的符号位是什么,高位均要补0。
十进制1的八位二进制位表示为00000001,取反加1的结果就是11111111,其表示十进制的-1。
------解决方案--------------------
关于左移,首先要看当前类型所占的位数,然后表示出来,然后看高位为0或者1,>>是带符号左移,如果最高位是0,那么就补零,如果最高位是1,那么就补1