[英]Why bitwise AND gives different byte?
Java中的一个字节长8位。 &
运算符按位进行and
运算。
十六进制表示形式采用两个十六进制字符0-F
。
0xFF
是一个字节。
如果我考虑&
操作,我认为处理器会这样做:
Bit no: 1 2 3 4 5 6 7 8 Binary: 0 0 0 0 0 0 1 0 = decimal 2 Operation: & & & & & & & & Value: 1 1 1 1 1 1 1 1 = 0xFF ---------------------------------------- Result: 0 0 0 0 0 0 1 0 = decimal 2
因为所有二进制文件都保持不变,所以我认为我们不需要& 0xFF
。
码
public static void main(String[] args) {
byte b = -1;
System.out.println(String.valueOf(b).concat(" and ").concat(String.valueOf(b & 0xFF)));
}
结果
-1 and 255
如果我的假设(我们不需要& 0xFF
)是正确的,为什么会有所不同呢?
0xFF
等于值为255
的int或00000000 00000000 00000000 11111111
。 字节-1是11111111
,因为它是带符号的,所以被解释为-1
。 如果未签名,则该255
。
当你&
这两个值,Java将返回两个值中较大的,这是的结果类型int
,所以最终的结果是位一个int 00000000 00000000 00000000 11111111
,计算结果为255
。
0xFF
是一个int
,而不是byte
,因此b & 0xFF
也是一个int
。 要获得所需的结果,您需要执行byte
算术(Java不允许这样做-所有小于int
数据类型在执行操作前都会隐式转换为int
),或者掩码0xFF
的每一位必须为1
在int
(全部32个)。 例如,请参阅以下内容:
System.out.println(0xFF); // 255. (only 8 of 32 bits are 1)
System.out.println((int)0xFF); // 255. (only 8 of 32 bits are 1)
System.out.println((byte)0xFF); // -1. (all 8 of 8 bits are 1)
System.out.println((int)(byte)0xFF); // -1. (all 32 of 32 bits are 1)
注意,通过强制转换为byte
并返回int
,我们使所有32位均为1
。 因此,以下代码可以满足您的要求(请注意,在将显式强制转换为byte
之后,存在对int
的隐式强制转换):
public static void main(String[] args) {
byte b = -1;
System.out.println(String.valueOf(b) + " and " + String.valueOf(b & (byte)0xFF)));
}
输出:
-1和-1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.