来自http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
十六进制文字 0xFF 是一个相等的 int(255)。 Java 将 int 表示为 32 位。二进制看起来像这样:
00000000 00000000 00000000 11111111
当您对任何数字使用此值 (255) 进行一点与操作时,它将屏蔽(使零)除该数字的最低 8 位之外的所有内容(将保持原样)。
... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101
& 类似于 % 但不是 really。
为什么是 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;
ReSet(0) 特定位
int thirdBitTobeReSet = ~(1 << 2) ; //(...1111011)
int onWhichThisHasTobeReSet = 6 ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;
异或
请注意,如果您执行两次异或运算,将得到相同的值。
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
上面对于交换两个没有 temp 的变量很有用,如下所示
a = a ^ b; b = a ^ b; a = a ^ b;
或
a ^= b ^= a ^= b;