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