java中的byte类型在运算过程中都会被转换为int类型进行运算,这样在对负的byte类型进行无符号右移的时候会出现和有符号右移同样的结果。
example:11110000>>>4 我们期待变为 00001111 ,但结果变为11111111。
原因:11110000先被转换为整型11111111111111111111111111110000,然后无符号右移4位变为00001111111111111111111111111111,
截取后8位11111111赋值给原值,出现以上结果。
技巧:我们可以把要参与运算的byte和0xff按位与(保持低8为不变,高位全部赋0),然后再参与无符号移位。
例子:
public class Test{
public static void main(String[] args){
byte b=(byte)0xf1;
byte c=(byte)(b>>4);//有符号右移
byte d=(byte)(b>>>4);//无符号右移(即高位自动填充0)
byte e=(byte)((b&0xff)>>4);
System.out.println(b+" "+c+" "+d+" "+e);
}
}