价值和0xff在Java中做什么?
我有以下Java代码:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
打印时结果是254,但我不知道这个代码是如何工作的。如果运算符只是按位的,那么为什么它不产生一个字节,而是一个整数?&
我有以下Java代码:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
打印时结果是254,但我不知道这个代码是如何工作的。如果运算符只是按位的,那么为什么它不产生一个字节,而是一个整数?&
它设置为(无符号)值,该值是将 的 8 位放在 最低 8 位中而得出的。result
value
result
像这样的东西是必要的原因是它是Java中的有符号类型。如果你刚刚写道:byte
int result = value;
然后以值而不是 结束。另一个微妙之处是,被定义为仅对值1 操作,因此发生的情况是:result
ff ff ff fe
00 00 00 fe
&
int
value
提升为 ()。int
ff ff ff fe
0xff
是文字 ()。int
00 00 00 ff
&
result
(关键是转换为在应用运算符之前发生。int
&
1嗯,不完全是。&
运算符也适用于长
整型值,如果任一操作数是长整型
。但不是在字节
上。请参阅 Java 语言规范,第 15.22.1 节和 5.6.2 节。
从 http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
十六进制文字0xFF是一个相等的int(255)。Java 将 int 表示为 32 位。在二进制文件中,它看起来像这样:
00000000 00000000 00000000 11111111
当你对任何数字都使用这个值(255)进行明智的和时,它将掩盖(使ZERO)除数字的最低8位(将按原样)之外的所有位。
... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101
&是类似于%的东西,但不是真的。
为什么0xff?这在((2的幂)-1)。所有((2 的幂) - 1)(例如 7, 255...)的行为类似于 % 运算符。
然后在
二进制中,0是,所有零,255看起来像这样:
00000000 00000000 00000000 11111111
-1 看起来像这样
11111111 11111111 11111111 11111111
当您按位和 0 到 255 之间的任何值执行 0xFF 的 AND 时,结果与该值完全相同。如果任何值高于 255,则结果将在 0-255 之间。
但是,如果您这样做:
-1 & 0xFF
你得到
00000000 00000000 00000000 11111111
,它不等于原始值 -1(十进制为 255)。11111111
再进行一些位操作:(与问题无关)
X >> 1 = X/2
X << 1 = 2X
检查任何特定位是否设置(1)或未设置(0),然后
int thirdBitTobeChecked = 1 << 2 (...0000100)
int onWhichThisHasTobeTested = 5 (.......101)
int isBitSet = onWhichThisHasTobeTested & thirdBitTobeChecked;
if(isBitSet > 0) {
//Third Bit is set to 1
}
设置(1) 特定位
int thirdBitTobeSet = 1 << 2 (...0000100)
int onWhichThisHasTobeSet = 2 (.......010)
onWhichThisHasTobeSet |= thirdBitTobeSet;
ReSet(0) 一个特定的位
int thirdBitTobeReSet = ~(1 << 2) ; //(...1111011)
int onWhichThisHasTobeReSet = 6 ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;
异或
请注意,如果执行两次 XOR 运算,将产生相同的值。
byte toBeEncrypted = 0010 0110
byte salt = 0100 1011
byte encryptedVal = toBeEncrypted ^ salt == 0110 1101
byte decryptedVal = encryptedVal ^ salt == 0010 0110 == toBeEncrypted :)
使用XOR的另一个逻辑是
if A (XOR) B == C (salt)
then C (XOR) B == A
C (XOR) A == B
以上对于在没有温度的情况下交换两个变量很有用,如下所示
a = a ^ b; b = a ^ b; a = a ^ b;
或
a ^= b ^= a ^= b;