我有以下的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打印时,但我不知道该代码是如何工作的。 如果&
运营商简单地按位,那么为什么它不会导致字节,而不是整数?
它设置result
到从推杆的8位而产生的(无符号)值value
中的最低8位result
。
在一些理由这样必要的是byte
是Java中的符号类型。 如果你只是写道:
int result = value;
然后result
最终会与值ff ff ff fe
,而不是00 00 00 fe
。 另一种微妙的是, &
被限定为仅在操作int
值1,所以发生的事情是:
value
被提升到一个int
( ff ff ff fe
)。 0xff
是一个int
字面( 00 00 00 ff
)。 &
被施加到得到所希望的值result
。 (该点是,转换为int
的之前发生&
施加操作者)。
1 井,不完全是。 在&
运营商工作的long
价值以及,如果操作数是一个long
。 但不是byte
。 见Java语言规范,部分15.22.1和5.6.2 。
从http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
十六进制文字为0xFF是一个等于INT(255)。 爪哇表示INT为32位。 它看起来像这样的二进制文件:
00000000 00000000 00000000 11111111
当你做一个逐位,并用这个值(255)上的任何数字,它是要掩盖(使零)所有,但数量的最低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
当你做一个位与0xFF的和从0到255之间的任何值,结果是完全相同的值。 如果任何值高于255仍是结果将是内0-255。
但是,如果你这样做:
-1 & 0xFF
你得到
00000000 00000000 00000000 11111111
,这不等于-1的原始值( 11111111
以十进制255)。
几个位操作:(不涉及这个问题)
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;
复位(0)的特定位
int thirdBitTobeReSet = ~(1 << 2) ; //(...1111011)
int onWhichThisHasTobeReSet = 6 ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;
XOR
不过请注意,如果你进行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;
它有助于减少大量的代码。 它偶尔在其由8位的RGB值中。
其中0xff的装置24(0的)和8(1'S)等00000000 00000000 00000000 11111111
它有效地掩盖了变量,因此只剩下在最后8位的值,而忽略位的其余全部
它看到在大多数情况下,试图从一个特殊格式标准的RGB值(其长度为8位)变换颜色值时等。
很好的解释看这里
以32位格式系统中的十六进制值0xff
表示00000000000000000000000011111111
即255(15*16^1+15*16^0)
以十进制。 和按位&运算掩模相同的8最右边的位作为在第一操作数。