Java 为什么按位和给出不同的字节?
java中的字节长度为8位。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
&
运算符执行按位和
操作
十六进制表示法需要两个十六进制字符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)));
}