จาก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
เมื่อคุณทำบิต AND เป็น 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) {
}
ตั้งค่า (1) บิตเฉพาะ
int thirdBitTobeSet = 1 << 2 (...0000100)
int onWhichThisHasTobeSet = 2 (.......010)
onWhichThisHasTobeSet |= thirdBitTobeSet;
ตั้งค่าใหม่ (0) บิตเฉพาะ
int thirdBitTobeReSet = ~(1 << 2) ;
int onWhichThisHasTobeReSet = 6 ;
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;