[英]Java “int i = byte1 | 0x0200” vs “int i = byte1”?
在位和移位操作中,类型
byte
被隐式转换为int
。 如果字节值是负数 ,则最高位是1,那么将使用1来填充int中的额外字节。 所以byte b1=-5; int i = b1 | 0x0200;
将给出i == -5作为结果。
我了解0x0200
等于0b0000 0010 0000 0000
。 但是在上面显示的段落中0x0200
的意义是什么?
我的意思是-b1 b1 | 0x0200
b1 | 0x0200
将始终等于i
(请参见下面的“ 我的测试 ”),然后在上面的段落中,为什么不简单地将byte b1=-5; int i = b1
写入byte b1=-5; int i = b1
byte b1=-5; int i = b1
吗?
我的测试 :
public static void main(final String args[]) {
final byte min_byte = Byte.MIN_VALUE; // -128
final byte limit = 0; // according to the bolded words in the passage
for (byte b = min_byte; b < limit; ++b) {
final int i1 = b;
final int i2 = b | 0x0200;
if (i1 != i2) { // this never happens!
System.out.println(b);
}
}
}
但是在上面显示的段落中0x0200的意义是什么?
这样做仅出于说明目的:值0x200
在一个位置等于1
的位置成1
。 这个想法是要表明结果不是0x000002FB
,而是实际为-5
,即0xFFFFFFFB
。
我了解0x0200等于0b1111 1110 0000 0000
不,不是。 正确的值由
int i = 0x0200; // <-- decimal 512
System.out.println(Integer.toBinaryString(i));
哪个输出
1000000000
如果我们检查您的第二个价值,
byte b1 = -5;
System.out.println(Integer.toBinaryString(b1));
我们得到
11111111111111111111111111111011
排列两个数字
11111111111111111111111111111011
00000000000000000000001000000000
它似乎很清楚,结果将是位值-5
(因为只有0
在-5
也是0
在0x0200
)。 为了确定意义,我们可以检查
int i = 0x0200; // <-- Decimal 512
System.out.println("Dec: " + Integer.toBinaryString(i).length());
产量
Dec: 10
因此,给定的按位或将强制第十位为真。 在您的输入字节中确实如此,但是如果您使用-十进制1535( 0b 101 1111 1111
),那么您会得到,
System.out.println(1535 | 0x0200);
输出是
2047
因为如果您对两个数字进行按位或运算
01000000000
10111111111
你得到
11111111111
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.