เนื่องจากไม่มีใครเจาะประเด็นว่าเหตุใดสิ่งเหล่านี้จึงมีประโยชน์:
ฉันใช้การดำเนินการระดับบิตมากเมื่อทำงานกับแฟล็ก ตัวอย่างเช่นหากคุณต้องการส่งต่อชุดของแฟล็กไปยังการดำเนินการ (เช่นFile.Open()
เปิดใช้งานโหมดอ่านและโหมดเขียนทั้งคู่) คุณสามารถส่งผ่านค่าเหล่านี้เป็นค่าเดียวได้ สิ่งนี้ทำได้โดยการกำหนดแฟล็กที่เป็นไปได้แต่ละรายการซึ่งเป็นบิตของตัวเองในบิตเซ็ต (ไบต์สั้น int หรือยาว) ตัวอย่างเช่น:
Read: 00000001
Write: 00000010
ดังนั้นหากคุณต้องการผ่านการอ่านและเขียนคุณจะต้องผ่าน (อ่าน | เขียน) ซึ่งจะรวมทั้งสองเข้าด้วยกัน
00000011
ซึ่งสามารถถอดรหัสได้ในอีกด้านหนึ่งเช่น:
if ((flag & Read) != 0) { //...
ซึ่งตรวจสอบ
00000011 &
00000001
ซึ่งส่งคืน
00000001
ซึ่งไม่ใช่ 0 ดังนั้นแฟล็กจึงระบุ READ
คุณสามารถใช้ XOR เพื่อสลับบิตต่างๆ ฉันเคยใช้สิ่งนี้เมื่อใช้แฟล็กเพื่อระบุอินพุตทิศทาง (ขึ้นลงซ้ายขวา) ตัวอย่างเช่นหากสไปรต์เคลื่อนที่ในแนวนอนและฉันต้องการให้สไปรท์หมุนไปรอบ ๆ :
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
ฉันเพียงแค่ XOR ค่าปัจจุบันด้วย (LEFT | RIGHT) ซึ่งจะปิด LEFT และเปิดขวาในกรณีนี้
Bit Shifting มีประโยชน์ในหลายกรณี
x << y
เหมือนกับ
x * 2 ปี
หากคุณต้องการคูณด้วยกำลังสองอย่างรวดเร็ว แต่ระวังการเปลี่ยน 1 บิตเป็นบิตด้านบนซึ่งจะทำให้จำนวนเป็นลบเว้นแต่จะไม่ได้ลงนาม นอกจากนี้ยังมีประโยชน์เมื่อจัดการกับข้อมูลขนาดต่างๆ ตัวอย่างเช่นการอ่านจำนวนเต็มจากสี่ไบต์:
int val = (A << 24) | (B << 16) | (C << 8) | D;
สมมติว่า A เป็นไบต์ที่สำคัญที่สุดและ D น้อยที่สุด มันจะจบลงด้วย:
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
สีมักจะถูกจัดเก็บด้วยวิธีนี้ (โดยไบต์ที่สำคัญที่สุดจะถูกละเว้นหรือใช้เป็นอัลฟ่า):
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
หากต้องการค้นหาค่าอีกครั้งเพียงแค่เลื่อนบิตไปทางขวาจนกว่าจะอยู่ด้านล่างสุดจากนั้นปิดบังบิตลำดับที่สูงกว่าที่เหลือ:
Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF
0xFF
เหมือนกับ11111111
. โดยพื้นฐานแล้วสำหรับ Red คุณจะทำสิ่งนี้:
Color >> 16 = (filled in 00000000 00000000)11111111 00010101 (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)