java为什么9&0xaaaa会得到一个未签名的结果?
convertToBinary方法用于显示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
的结果是无符号的,有人能解释为什么吗
# 1 楼答案
最后一个结果并不能证明
>>
进行了无符号移位(说值是无符号的是没有意义的,值只是一堆位,有符号或无符号的是操作)由于您只打印8位,因此没有查看24个高位,因此您没有看到唯一受
x >> 1
和x >>> 1
之间差异影响的位,这是最高位。有符号移位和无符号移位之间没有任何区别,所以根据这个结果,你不能说发生了什么# 2 楼答案
a
是一个int
,文字a&0xaaaa
也是。按位and运算的结果也是int
。它有32位。与你已经屏蔽了
a
中除了最低位以外的所有位。结果是一个正的32位int
值。所以通过打印出最低的8位你所揭示的只是^{中第9位的值
请注意,位掩码
0xaaaa
,即使有一个有缺陷的假设,即它不比使用的数字宽,仍然是一个16位的值,并且只打印较低的8位