Từ http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
Chữ thập lục phân 0xFF là một int bằng (255). Java biểu diễn int là 32 bit. Nó trông như thế này trong hệ nhị phân:
00000000 00000000 00000000 11111111
Khi bạn thực hiện một chút khôn ngoan VÀ với giá trị này (255) trên bất kỳ số nào, nó sẽ che dấu (tạo số KHÔNG) tất cả trừ 8 bit thấp nhất của số (sẽ là nguyên trạng).
... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101
& là một cái gì đó giống như% nhưng không thực sự .
Và tại sao 0xff? này trong ((lũy thừa của 2) - 1). Tất cả ((lũy thừa của 2) - 1) (ví dụ: 7, 255 ...) sẽ hoạt động giống như toán tử%.
Sau đó,
Trong hệ nhị phân, 0 là, tất cả các số không và 255 trông giống như sau:
00000000 00000000 00000000 11111111
Và -1 trông như thế này
11111111 11111111 11111111 11111111
Khi bạn thực hiện theo bitwise AND của 0xFF và bất kỳ giá trị nào từ 0 đến 255, kết quả sẽ giống hệt như giá trị. Và nếu bất kỳ giá trị nào cao hơn 255 thì kết quả sẽ nằm trong khoảng 0-255.
Tuy nhiên, nếu bạn làm:
-1 & 0xFF
bạn lấy
00000000 00000000 00000000 11111111
, KHÔNG bằng giá trị ban đầu của -1 ( 11111111
là 255 trong hệ thập phân).
Thêm một vài thao tác: (Không liên quan đến câu hỏi)
X >> 1 = X/2
X << 1 = 2X
Kiểm tra bất kỳ bit cụ thể nào được đặt (1) hay không (0) sau đó
int thirdBitTobeChecked = 1 << 2 (...0000100)
int onWhichThisHasTobeTested = 5 (.......101)
int isBitSet = onWhichThisHasTobeTested & thirdBitTobeChecked;
if(isBitSet > 0) {
//Third Bit is set to 1
}
Đặt (1) một bit cụ thể
int thirdBitTobeSet = 1 << 2 (...0000100)
int onWhichThisHasTobeSet = 2 (.......010)
onWhichThisHasTobeSet |= thirdBitTobeSet;
Đặt lại (0) một bit cụ thể
int thirdBitTobeReSet = ~(1 << 2) ; //(...1111011)
int onWhichThisHasTobeReSet = 6 ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;
XOR
Chỉ cần lưu ý rằng nếu bạn thực hiện thao tác XOR hai lần, kết quả sẽ có cùng giá trị.
byte toBeEncrypted = 0010 0110
byte salt = 0100 1011
byte encryptedVal = toBeEncrypted ^ salt == 0110 1101
byte decryptedVal = encryptedVal ^ salt == 0010 0110 == toBeEncrypted :)
Một logic nữa với XOR là
if A (XOR) B == C (salt)
then C (XOR) B == A
C (XOR) A == B
Ở trên rất hữu ích để hoán đổi hai biến mà không cần tạm thời như bên dưới
a = a ^ b; b = a ^ b; a = a ^ b;
HOẶC LÀ
a ^= b ^= a ^= b;