0Pricing
C Academy · บทเรียน

มาสก์บิตและแฟล็ก

ตั้งค่า ล้าง และสลับบิต

มาสก์บิตและแฟล็ก เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ตัวดำเนินการระดับบิต
  2. การเลื่อนบิต
  3. มาสก์บิตและแฟล็ก
  4. เทคนิคบิตที่ใช้ได้จริง
← กลับไปที่ C Academy