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

การเลื่อนบิต

เลื่อนซ้ายและขวา

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

การเลื่อนบิต

ตัวดำเนินการเลื่อนจะย้ายบิตทั้งหมดของจำนวนเต็มไปทางซ้ายหรือขวาตามจำนวนตำแหน่งที่กำหนด

การเลื่อนซ้ายคือ << และการเลื่อนขวาคือ >>

#include <stdio.h>

int main(void) {
    unsigned x = 1;
    printf("1 << 3 = %u\n", x << 3);
    return 0;
}

การเลื่อนซ้ายเป็นการคูณ

การเลื่อนไปทางซ้าย n ตำแหน่งจะคูณค่าที่ไม่มีเครื่องหมายด้วย 2 ยกกำลัง n

1 << 3 มีค่าเป็น 8 และ 5 << 1 มีค่าเป็น 10

#include <stdio.h>

int main(void) {
    printf("5 << 1 = %u\n", 5u << 1);
    printf("3 << 4 = %u\n", 3u << 4);
    return 0;
}

การเลื่อนขวาเป็นการหาร

การเลื่อนไปทางขวา n ตำแหน่งจะหารค่าที่ไม่มีเครื่องหมายด้วย 2 ยกกำลัง n โดยทิ้งบิตที่หลุดออกทางขวา

20 >> 2 มีค่าเป็น 5

#include <stdio.h>

int main(void) {
    printf("20 >> 2 = %u\n", 20u >> 2);
    printf("7 >> 1 = %u\n", 7u >> 1);
    return 0;
}

กำลังของสอง

การเลื่อน 1 ไปทางซ้ายเป็นวิธีที่เร็วที่สุดในการสร้างกำลังของสอง

1 << n คือกำลังที่ n ของสอง

#include <stdio.h>

int main(void) {
    for (int n = 0; n < 6; n++) {
        printf("2^%d = %u\n", n, 1u << n);
    }
    return 0;
}

การมองภาพการเลื่อนบิต

การแสดงบิตก่อนและหลังจะทำให้เห็นว่ารูปแบบเลื่อนไปอย่างไร

#include <stdio.h>

void print_bits(unsigned char v) {
    for (int i = 7; i >= 0; i--) putchar((v >> i) & 1 ? '1' : '0');
    putchar('\n');
}

int main(void) {
    unsigned char v = 0b00000110;
    print_bits(v);
    print_bits(v << 2);
    return 0;
}

การดึงค่าบิต

หากต้องการอ่านบิตหมายเลข i ให้เลื่อนค่าไปทางขวา i ตำแหน่ง แล้วใช้มาสก์ด้วย 1

ผลลัพธ์คือ 0 หรือ 1

#include <stdio.h>

int main(void) {
    unsigned v = 0b10110;
    for (int i = 0; i < 5; i++) {
        printf("bit %d = %u\n", i, (v >> i) & 1);
    }
    return 0;
}

การสร้างค่าทีละบิต

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

#include <stdio.h>

int main(void) {
    unsigned v = 0;
    v |= (1u << 0);
    v |= (1u << 2);
    v |= (1u << 4);
    printf("v = %u\n", v);
    return 0;
}

ข้อควรระวังในการเลื่อนขวาจำนวนเต็มมีเครื่องหมาย

การเลื่อนจำนวนเต็มมีเครื่องหมายที่เป็นลบไปทางขวาขึ้นอยู่กับการกำหนดของการนำไปใช้งาน: อาจคัดลอกบิตเครื่องหมาย

เพื่อให้การดำเนินการระดับบิตคาดเดาได้ ควรใช้ชนิด unsigned

#include <stdio.h>

int main(void) {
    int s = -8;
    printf("-8 >> 1 = %d (implementation-defined)\n", s >> 1);
    unsigned u = 8;
    printf("8u >> 1 = %u\n", u >> 1);
    return 0;
}

หลีกเลี่ยงการเลื่อนเกินขอบเขต

การเลื่อนด้วยจำนวนที่มากกว่าหรือเท่ากับความกว้างของชนิดข้อมูลถือเป็น พฤติกรรมที่ไม่กำหนด

ไม่อนุญาตให้เลื่อนค่าขนาด 32 บิตด้วยจำนวน 32 บิตขึ้นไป

#include <stdio.h>
#include <limits.h>

int main(void) {
    printf("unsigned has %zu bits\n", sizeof(unsigned) * CHAR_BIT);
    printf("Safe shift 1u << 31 = %u\n", 1u << 31);
    return 0;
}

การรวมการเลื่อนกับมาสก์

การเลื่อนและมาสก์ร่วมกันใช้ดึงฟิลด์ที่มีหลายบิตออกมา ในที่นี้เราดึง 4 บิตตรงกลางออกจากไบต์

#include <stdio.h>

int main(void) {
    unsigned v = 0b11010110;
    unsigned field = (v >> 2) & 0b1111;
    printf("field = %u\n", field);
    return 0;
}

การคูณและการบวกอย่างรวดเร็ว

การรวมการเลื่อนเข้าด้วยกันช่วยให้คูณด้วยค่าคงที่ได้อย่างรวดเร็ว การคูณด้วย 10 เท่ากับการเลื่อน 3 บิต (คูณ 8) แล้วบวกด้วยการเลื่อน 1 บิต (คูณ 2)

#include <stdio.h>

int main(void) {
    unsigned x = 7;
    unsigned times10 = (x << 3) + (x << 1);
    printf("7 * 10 = %u\n", times10);
    return 0;
}

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

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

ทบทวน

คุณได้เรียนรู้เกี่ยวกับตัวดำเนินการเลื่อน:

  • << เลื่อนไปทางซ้ายและคูณด้วยเลขยกกำลังของสอง
  • >> เลื่อนไปทางขวาและหารด้วยเลขยกกำลังของสอง
  • (v >> i) & 1 ใช้ดึงบิตเดียวออกมา
  • ใช้ unsigned เพื่อให้การเลื่อนมีผลลัพธ์ที่คาดเดาได้ และอย่าเลื่อนด้วยจำนวนที่เท่ากับหรือมากกว่าความกว้างของชนิดข้อมูล

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

บทเรียน “การเลื่อนบิต” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การเลื่อนบิต”

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

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

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

บทเรียน “การเลื่อนบิต” ใช้เวลานานแค่ไหน

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

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

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

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

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