ฉันค่อนข้างใหม่สำหรับการเขียนโปรแกรม C และฉันพบการปิดบังเล็กน้อย บางคนสามารถอธิบายแนวคิดและหน้าที่ทั่วไปของการปิดบังบิตให้ฉันได้หรือไม่ ตัวอย่างชื่นชมมาก
ฉันค่อนข้างใหม่สำหรับการเขียนโปรแกรม C และฉันพบการปิดบังเล็กน้อย บางคนสามารถอธิบายแนวคิดและหน้าที่ทั่วไปของการปิดบังบิตให้ฉันได้หรือไม่ ตัวอย่างชื่นชมมาก
คำตอบ:
หน้ากากจะกำหนดว่าคุณต้องการเก็บบิตใดและบิตใดที่คุณต้องการล้าง
การปิดบังคือการกระทำที่ใช้มาส์กกับค่า นี่คือความสำเร็จโดยทำ:
ด้านล่างเป็นตัวอย่างของการแยกเซ็ตย่อยของบิตในค่า:
Mask: 00001111b
Value: 01010101b
การนำรูปแบบไปใช้กับค่าหมายความว่าเราต้องการล้างบิตแรก (สูงกว่า) 4 บิตและเก็บบิตสุดท้าย (ล่าง) 4 บิต ดังนั้นเราจึงแยก 4 บิตที่ต่ำกว่า ผลลัพธ์คือ:
Mask: 00001111b
Value: 01010101b
Result: 00000101b
กาวถูกนำมาใช้โดยใช้ AND ดังนั้นใน C เราได้รับ
uint8_t stuff(...) {
uint8_t mask = 0x0f; // 00001111b
uint8_t value = 0x55; // 01010101b
return mask & value;
}
นี่เป็นกรณีการใช้งานที่ค่อนข้างทั่วไป: การแยกแต่ละไบต์จากคำที่ใหญ่ เรากำหนดบิตการเรียงลำดับสูงในคำว่าเป็นไบต์แรก เราใช้ตัวดำเนินการสองตัวสำหรับสิ่งนี้&
และ>>
(เลื่อนไปทางขวา) นี่คือวิธีที่เราสามารถแยกสี่ไบต์จากจำนวนเต็ม 32 บิต:
void more_stuff(uint32_t value) { // Example value: 0x01020304
uint32_t byte1 = (value >> 24); // 0x01020304 >> 24 is 0x01 so
// no masking is necessary
uint32_t byte2 = (value >> 16) & 0xff; // 0x01020304 >> 16 is 0x0102 so
// we must mask to get 0x02
uint32_t byte3 = (value >> 8) & 0xff; // 0x01020304 >> 8 is 0x010203 so
// we must mask to get 0x03
uint32_t byte4 = value & 0xff; // here we only mask, no shifting
// is necessary
...
}
โปรดสังเกตว่าคุณสามารถสลับคำสั่งของผู้ให้บริการด้านบนได้คุณสามารถทำหน้ากากก่อนแล้วจึงเปลี่ยน ผลลัพธ์เหมือนกัน แต่ตอนนี้คุณต้องใช้มาสก์ที่แตกต่างกัน:
uint32_t byte3 = (value & 0xff00) >> 8;
&
ผู้ประกอบการซึ่งเขียนเป็น
#define MASK 0x000000FF .... my_uint32_t &= ~MASK
โดยกำบังเนื้อหาออกไป:
b
ที่แท้จริงเพื่อระบุไบนารีไม่สนับสนุนคอมไพเลอร์ทั้งหมดถูกต้องหรือไม่
การปิดบังหมายถึงการเก็บ / เปลี่ยนแปลง / ลบส่วนที่ต้องการของข้อมูล ให้ดูการดำเนินการปิดบังภาพ การดำเนินการปิดบังเช่นนี้เป็นการลบสิ่งที่ไม่ใช่ผิวหนังออก
เรากำลังดำเนินการและดำเนินการในตัวอย่างนี้ นอกจากนี้ยังมีการหลอกลวงอื่น ๆ operators- หรือ , แฮคเกอร์
Bit-Maskingหมายถึงรูปแบบการทับซ้อนทับบิต นี่คือการหลอกลวงเล็กน้อยกับAND -
1 1 1 0 1 1 0 1 [input] (&) 0 0 1 1 1 1 0 0 [mask] ------------------------------ 0 0 1 0 1 1 0 0 [output]
ดังนั้นเหลือเพียง 4 บิตกลาง (เนื่องจากบิตเหล่านี้อยู่1
ในรูปแบบนี้) จึงยังคงอยู่
ให้ดูด้วยXOR -
1 1 1 0 1 1 0 1 [input] (^) 0 0 1 1 1 1 0 0 [mask] ------------------------------ 1 1 0 1 0 0 0 1 [output]
ตอนกลาง 4 บิตจะพลิก ( 1
กลายเป็น0
, 0
กลายเป็น1
)
ดังนั้นการใช้บิตมาสก์เราสามารถเข้าถึงแต่ละบิต [ ตัวอย่าง ] บางครั้งเทคนิคนี้อาจใช้สำหรับการปรับปรุงประสิทธิภาพ ใช้เวลานี้เป็นตัวอย่าง -
bool isOdd(int i) {
return i%2;
}
ฟังก์ชั่นนี้จะบอกว่าเป็นจำนวนเต็มคี่ / คู่ เราสามารถบรรลุผลลัพธ์เดียวกันด้วยประสิทธิภาพมากขึ้นโดยใช้บิตมาสก์
bool isOdd(int i) {
return i&1;
}
คำอธิบายสั้น ๆ : ถ้าบิตที่มีนัยสำคัญน้อยที่สุดของเลขฐานสอง1
มันจะเป็นเลขคี่ เพราะ0
มันจะเป็นอย่างนั้น ดังนั้นด้วยการทำและกับ1
เรากำลังลบบิตอื่น ๆ ทั้งหมดยกเว้นบิตที่สำคัญน้อยที่สุดเช่น:
55 -> 0 0 1 1 0 1 1 1 [input] (&) 1 -> 0 0 0 0 0 0 0 1 [mask] --------------------------------------- 1 <- 0 0 0 0 0 0 0 1 [output]