З 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
& - це щось на зразок%, але насправді не так .
А чому 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
Вищевказане корисне для обміну двома змінними без temp, як показано нижче
a = a ^ b; b = a ^ b; a = a ^ b;
АБО
a ^= b ^= a ^= b;