当前位置: 代码迷 >> J2SE >> java 位运算 , 求解释,该如何处理
  详细解决方案

java 位运算 , 求解释,该如何处理

热度:14   发布时间:2016-04-23 20:44:07.0
java 位运算 , 求解释
假设:
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