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

Java 为什么按位和给出不同的字节?,java,bit-manipulation,bitwise-operators,Java,Bit Manipulation,Bitwise Operators,java中的字节长度为8位。&运算符执行按位和操作 十六进制表示法需要两个十六进制字符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 ---------------------------------------- Res

java中的字节长度为8位。
&
运算符执行按位
操作

十六进制表示法需要两个十六进制字符
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 结果

-1 and 255

如果我的假设(我们不需要
&0xFF
)是正确的,为什么会有差异?

0xFF
等于一个值为
255
00000000000000000000000000111111
的整数。字节-1是
11111111
,因为它是有符号的,所以被解释为
-1
。如果它是未签名的,它也将是
255


当您
&
这两个值时,Java将返回两个值中较大值类型的结果,即
int
,因此最终结果是一个位为
00000000000000000000111111
,计算结果为
255
0xFF
的整数,而不是
字节的整数,所以
b&0xFF
也是一个
int
。要获得想要的结果,您要么需要执行
byte
算术(Java不允许这样做——所有小于
int
的数据类型在执行操作之前都会隐式转换为
int
),要么掩码
0xFF
必须为
int
中的每一位都有
1
(全部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)
请注意,通过强制转换到
字节
并返回到
int
,我们使所有32位都成为
1
。因此,下面的代码执行您想要的操作(注意,显式转换为
byte
之后,有一个隐式转换为
int
):

输出:

-1和-1


尝试
字节c=b&0xFF。您可能会感到惊讶。@PeterRader为了更具体地说明这个问题,
0xFF
是一个
int
,而不是
byte
,因此
b&0xFF
也是一个
int
。但是,请注意,
b&(byte)0xFF
的结果仍然是
int
。Java从来不会对小于
int
的任何对象进行算术运算,因此
b&(byte)0xFF
隐式等同于
(int)b&(int)(byte)0xFF
。两个答案都是正确的,但你需要声誉。
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)
public static void main(String[] args) {
    byte b = -1;
    System.out.println(String.valueOf(b) + " and " + String.valueOf(b & (byte)0xFF)));
}