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

เทคนิคบิตที่ใช้ได้จริง

เทคนิคที่พบบ่อย

เทคนิคบิตที่ใช้ได้จริง เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

เทคนิคบิตที่มีประโยชน์

เมื่อคุณเข้าใจตัวดำเนินการระดับบิตแล้ว คุณจะสามารถใช้เทคนิคสั้นกระชับได้หลายอย่าง เทคนิคเหล่านี้ทำงานรวดเร็วและมักพบในโค้ดจริง

เรามาดูเทคนิคที่ใช้บ่อยที่สุดกัน

#include <stdio.h>

int main(void) {
    unsigned x = 6;
    printf("x & 1 = %u (odd if 1)\n", x & 1);
    return 0;
}

เลขคู่หรือเลขคี่

บิตต่ำสุดใช้บอกความเป็นคู่หรือคี่ x & 1 มีค่าเป็น 1 สำหรับเลขคี่ และเป็น 0 สำหรับเลขคู่

#include <stdio.h>

int main(void) {
    for (unsigned x = 0; x < 5; x++) {
        printf("%u is %s\n", x, (x & 1) ? "odd" : "even");
    }
    return 0;
}

การตรวจสอบเลขยกกำลังของสอง

จำนวนบวกจะเป็นเลขยกกำลังของสองเมื่อมีบิตที่ตั้งค่าอยู่เพียงหนึ่งบิต นิพจน์ x & (x - 1) จะมีค่าเป็น 0 เฉพาะในกรณีนี้

#include <stdio.h>

int is_pow2(unsigned x) {
    return x != 0 && (x & (x - 1)) == 0;
}

int main(void) {
    printf("%d %d %d\n", is_pow2(16), is_pow2(18), is_pow2(1));
    return 0;
}

ล้างบิตที่ตั้งค่าต่ำสุด

x & (x - 1) จะล้างบิตที่ตั้งค่าต่ำสุด นี่เป็นพื้นฐานของการนับบิตที่ตั้งค่าอย่างรวดเร็ว

#include <stdio.h>

int main(void) {
    unsigned x = 0b10110;
    printf("before: %u\n", x);
    printf("after:  %u\n", x & (x - 1));
    return 0;
}

แยกบิตที่ตั้งค่าต่ำสุด

x & (-x) จะแยกบิตที่ตั้งค่าต่ำสุดออกมา ทำให้เหลือบิตนั้นเพียงบิตเดียวที่เปิดอยู่

วิธีนี้อาศัยการแทนค่าแบบส่วนเติมเต็มสอง

#include <stdio.h>

int main(void) {
    unsigned x = 0b10110;
    printf("lowest set bit = %u\n", x & (-x));
    return 0;
}

การนับบิตที่ตั้งค่า

การล้างบิตที่ตั้งค่าต่ำสุดซ้ำไปเรื่อย ๆ จะนับจำนวนบิตที่ถูกตั้งค่า โดยใช้จำนวนขั้นตอนเท่ากับจำนวนบิตที่ตั้งค่า

#include <stdio.h>

int popcount(unsigned x) {
    int n = 0;
    while (x) { x &= (x - 1); n++; }
    return n;
}

int main(void) {
    printf("%d\n", popcount(255));
    printf("%d\n", popcount(0b1010));
    return 0;
}

การสลับค่าโดยไม่ใช้ตัวแปรชั่วคราว

การสลับค่าแบบ XOR ใช้แลกเปลี่ยนจำนวนเต็มสองจำนวนโดยไม่ต้องใช้พื้นที่จัดเก็บเพิ่มเติม

#include <stdio.h>

int main(void) {
    int a = 3, b = 8;
    a ^= b; b ^= a; a ^= b;
    printf("a=%d b=%d\n", a, b);
    return 0;
}

ปัดขึ้นเป็นเลขยกกำลังของสอง

คุณสามารถปัดค่าชนิด unsigned ขึ้นเป็นเลขยกกำลังของสองถัดไปได้ โดยกระจายบิตสูงสุดลงมาทางขวา แล้วบวก 1

#include <stdio.h>

unsigned next_pow2(unsigned v) {
    v--;
    v |= v >> 1; v |= v >> 2; v |= v >> 4;
    v |= v >> 8; v |= v >> 16;
    return v + 1;
}

int main(void) {
    printf("%u\n", next_pow2(17));
    printf("%u\n", next_pow2(100));
    return 0;
}

การตรวจสอบว่าบิตแตกต่างกันหรือไม่

ค่าทั้งสองมีบิตต่างกันตรงตำแหน่งที่ a ^ b มีบิตที่ตั้งค่าอยู่ เมื่อนับบิตเหล่านั้นก็จะได้ระยะห่างแฮมมิง

#include <stdio.h>

int main(void) {
    unsigned a = 0b1101, b = 0b1011;
    unsigned diff = a ^ b;
    int count = 0;
    while (diff) { diff &= diff - 1; count++; }
    printf("hamming distance = %d\n", count);
    return 0;
}

หาค่าสัมบูรณ์โดยไม่ใช้การแยกทาง

คุณสามารถใช้บิตเครื่องหมายคำนวณค่าสัมบูรณ์โดยไม่ใช้ if มาสก์จะมีค่าเป็น 1 ทั้งหมดสำหรับจำนวนลบ และมีค่าเป็น 0 ทั้งหมดสำหรับจำนวนที่ไม่เป็นลบ

#include <stdio.h>

int main(void) {
    int x = -42;
    int mask = x >> 31;
    int abs = (x + mask) ^ mask;
    printf("abs = %d\n", abs);
    return 0;
}

การตั้งค่าบิตตามดัชนี

รวมการเลื่อนกับ OR เพื่อตั้งค่าตำแหน่งบิตใด ๆ ที่คำนวณขึ้นขณะโปรแกรมทำงาน

#include <stdio.h>

int main(void) {
    unsigned v = 0;
    int positions[] = {1, 3, 5};
    for (int i = 0; i < 3; i++) {
        v |= (1u << positions[i]);
    }
    printf("v = %u\n", v);
    return 0;
}

ตรวจสอบความเข้าใจ

ทดสอบความรู้เกี่ยวกับเทคนิคบิตของคุณ

ทบทวน

คุณได้เรียนรู้เทคนิคบิตที่ใช้ได้จริง:

  • x & 1 ใช้ตรวจสอบเลขคู่หรือเลขคี่
  • x & (x - 1) ล้างบิตที่ตั้งค่าต่ำสุดและตรวจจับเลขยกกำลังของสอง
  • x & (-x) แยกบิตที่ตั้งค่าต่ำสุดออกมา
  • การนับบิต การสลับค่าแบบ XOR ระยะห่างแฮมมิง และการหาค่าสัมบูรณ์โดยไม่ใช้การแยกทาง

คำถามที่พบบ่อย

บทเรียน “เทคนิคบิตที่ใช้ได้จริง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เทคนิคบิตที่ใช้ได้จริง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เทคนิคบิตที่ใช้ได้จริง”

เทคนิคที่พบบ่อย คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “เทคนิคบิตที่ใช้ได้จริง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม

ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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