繁体   English   中英

为什么按位AND给出不同的字节?

[英]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一位必须为1int (全部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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM