为什么-9& 0xaaaa获得无符号结果?

时间:2015-02-28 14:06:53

标签: java bit-manipulation

转换为二进制的方法用于显示8位二进制数

public static String convertToBinary(int a){
    String binary="";
    for(int i=0;i<8;++i){
        Integer bit=new Integer(a&1);
        binary=bit.toString()+binary;
        a>>=1;
    }
    return binary;
}

public static void main(String[] args) {
    int a=-9;
    System.out.println(convertBinary(a));            //11110111
    System.out.println(convertBinary(0xaaaa));       //10101010
    System.out.println(convertBinary(a&0xaaaa));     //10100010
    System.out.println(convertBinary((a&0xaaaa)>>1));//01010001
}

最后一个结果证明a&0xaaaa的结果是未签名的,任何人都可以解释原因吗?

2 个答案:

答案 0 :(得分:4)

aint,文字a&0xaaaa也是int。按位和运算的结果也是a&0xaaaa 。它有32位。与

a

你屏蔽了除int以外的最低位以外的所有位。结果是一个正的32位(a&0xaaaa)>>1) 值。所以通过打印出最低的8位

a&0xaaaa

你所揭示的是0xaaaa中第9位的值。

请注意,位掩码{{1}},即使假设它不比使用的数字宽,仍然是一个16位值,而您只打印低8位。

答案 1 :(得分:0)

最后一个结果并不能证明>>执行了无符号移位(说无符号值是无意义的,值只是一堆位,它是操作已签名或无符号)。

由于您只打印了8位,因此没有查看24位高位,您还没有看到唯一可能受x >> 1x >>> 1之间差异影响的位,是最高位。签名班次和无符号班次之间没有任何区别,因此基于该结果,您无法说出发生了什么。