มาสก์บิตและแฟล็ก
ตั้งค่า ล้าง และสลับบิต
มาสก์บิตและแฟล็ก เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
บิตในฐานะแฟล็ก
จำนวนเต็มเพียงจำนวนเดียวสามารถเก็บการตั้งค่าเปิดหรือปิดได้หลายรายการ โดยใช้หนึ่งบิตต่อหนึ่งรายการ แต่ละบิตคือ แฟล็ก
วิธีนี้ใช้พื้นที่น้อยและทำงานรวดเร็ว จึงพบได้บ่อยในระบบปฏิบัติการและโค้ดสำหรับระบบฝังตัว
#include <stdio.h>
int main(void) {
unsigned flags = 0;
printf("Initial flags = %u\n", flags);
return 0;
}การกำหนดมาสก์
มาสก์ คือค่าที่มีการกำหนดบิตบางตำแหน่งไว้ ให้กำหนดแฟล็กแต่ละรายการเป็นเลขยกกำลังของสอง เพื่อให้แต่ละรายการใช้บิตของตัวเอง
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
#define EXEC (1u << 2)
int main(void) {
printf("READ=%u WRITE=%u EXEC=%u\n", READ, WRITE, EXEC);
return 0;
}การตั้งค่าบิต
หากต้องการเปิดแฟล็ก ให้ทำ OR ค่ากับมาสก์: flags |= MASK
บิตที่ถูกตั้งค่าไว้แล้วจะยังคงถูกตั้งค่าอยู่
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
int main(void) {
unsigned flags = 0;
flags |= READ;
flags |= WRITE;
printf("flags = %u\n", flags);
return 0;
}การล้างค่าบิต
หากต้องการปิดแฟล็ก ให้ทำ AND กับมาสก์ที่กลับบิตแล้ว: flags &= ~MASK
มาสก์ที่กลับบิตแล้วจะมีค่า 0 ในบิตเป้าหมาย และมีค่า 1 ในตำแหน่งอื่นทั้งหมด
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
int main(void) {
unsigned flags = READ | WRITE;
flags &= ~WRITE;
printf("flags = %u\n", flags);
return 0;
}การสลับค่าบิต
หากต้องการ สลับ ค่าแฟล็ก ให้ทำ XOR กับมาสก์: flags ^= MASK
หากแฟล็กเปิดอยู่ แฟล็กจะถูกปิด และในทางกลับกัน
#include <stdio.h>
#define EXEC (1u << 2)
int main(void) {
unsigned flags = 0;
flags ^= EXEC;
printf("after toggle: %u\n", flags);
flags ^= EXEC;
printf("after toggle: %u\n", flags);
return 0;
}การตรวจสอบบิต
หากต้องการตรวจสอบว่าแฟล็กเปิดอยู่หรือไม่ ให้ทำ AND กับมาสก์แล้วตรวจสอบผลลัพธ์: flags & MASK จะมีค่าไม่เป็นศูนย์เมื่อบิตถูกตั้งค่า
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
int main(void) {
unsigned flags = READ;
if (flags & READ) printf("READ is on\n");
if (flags & WRITE) printf("WRITE is on\n");
else printf("WRITE is off\n");
return 0;
}การตั้งค่าแฟล็กหลายรายการ
รวมมาสก์ด้วย OR เพื่อตั้งค่าแฟล็กหลายรายการพร้อมกัน
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
#define EXEC (1u << 2)
int main(void) {
unsigned flags = READ | WRITE | EXEC;
printf("all set: %u\n", flags);
return 0;
}การตรวจสอบหลายรายการพร้อมกัน
หากต้องการตรวจสอบว่าแฟล็ก ทั้งหมด ในกลุ่มถูกตั้งค่าแล้ว ให้ทำ AND กับมาสก์ที่รวมกัน แล้วเปรียบเทียบกับมาสก์นั้นเอง
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
int main(void) {
unsigned flags = READ | WRITE;
unsigned need = READ | WRITE;
if ((flags & need) == need) printf("both present\n");
return 0;
}การแสดงแฟล็กที่เปิดอยู่
วนลูปผ่านมาสก์ของคุณเพื่อรายงานว่าแฟล็กใดกำลังเปิดอยู่
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
#define EXEC (1u << 2)
int main(void) {
unsigned flags = READ | EXEC;
if (flags & READ) printf("R");
if (flags & WRITE) printf("W");
if (flags & EXEC) printf("X");
printf("\n");
return 0;
}การนับบิตที่ตั้งค่า
หากต้องการทราบว่ามีแฟล็กกี่รายการที่เปิดอยู่ ให้นับบิตที่ตั้งค่าโดยล้างบิตที่ตั้งค่าต่ำสุดซ้ำไปเรื่อย ๆ
#include <stdio.h>
int main(void) {
unsigned v = 0b10110;
int count = 0;
while (v) {
v &= (v - 1);
count++;
}
printf("set bits = %d\n", count);
return 0;
}การใช้ enum สำหรับแฟล็ก
การใช้ enum ช่วยจัดระเบียบคำจำกัดความของแฟล็กและทำให้อ่านง่าย
#include <stdio.h>
enum { OPT_A = 1, OPT_B = 2, OPT_C = 4 };
int main(void) {
unsigned opts = OPT_A | OPT_C;
printf("opts = %u\n", opts);
if (opts & OPT_C) printf("C enabled\n");
return 0;
}ตรวจสอบความเข้าใจ
ทดสอบความรู้เกี่ยวกับมาสก์และแฟล็กของคุณ
ทบทวน
คุณได้เรียนรู้วิธีจัดการแฟล็กบิต:
- ตั้งค่าด้วย
flags |= MASK - ล้างค่าด้วย
flags &= ~MASK - สลับค่าด้วย
flags ^= MASK - ตรวจสอบด้วย
flags & MASK - กำหนดมาสก์เป็นเลขยกกำลังของสอง โดยมักใช้แมโครหรือ enum
คำถามที่พบบ่อย
บทเรียน “มาสก์บิตและแฟล็ก” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “มาสก์บิตและแฟล็ก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “มาสก์บิตและแฟล็ก”
ตั้งค่า ล้าง และสลับบิต คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “มาสก์บิตและแฟล็ก” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม
ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ตัวดำเนินการระดับบิต
- การเลื่อนบิต
- มาสก์บิตและแฟล็ก
- เทคนิคบิตที่ใช้ได้จริง