bitwise Operaทอร์ใน C: AND, OR, XOR, Shift & เสริม

⚡ สรุปอย่างชาญฉลาด

ตัวดำเนินการบิตในภาษา C จะจัดการข้อมูลในระดับบิตแต่ละบิต โดยใช้การดำเนินการ AND, OR, XOR, การผกผัน และการเลื่อนบิตกับตัวถูกดำเนินการจำนวนเต็ม เพื่อทำการคำนวณที่รวดเร็วยิ่งขึ้น จัดเก็บแฟล็ก และควบคุมฮาร์ดแวร์ในการเขียนโปรแกรมระดับต่ำและแบบฝังตัว

  • 🧮 Operaทอร์: ตัวดำเนินการทั้งหกตัว ได้แก่ AND (&), OR (|), XOR (^), ส่วนเติมเต็ม (~), การเลื่อนบิตซ้าย (<<), การเลื่อนบิตขวา (>>) ทำงานทีละบิต
  • 🔗 และหรือ: ผลลัพธ์ของ & จะเป็น 1 ก็ต่อเมื่อบิตทั้งสองเป็น 1 เท่านั้น และผลลัพธ์ของ | จะเป็น 1 เมื่อบิตใดบิตหนึ่งเป็น 1
  • 🔀 แฮคเกอร์: ผลลัพธ์ของ ^ คือ 1 เมื่อมีบิตเพียงบิตเดียวเป็น 1 ซึ่งมีประโยชน์สำหรับการสลับบิตและการสลับค่าping ค่า
  • ↔️ Shifts: ตัวดำเนินการ << และ >> ใช้สำหรับเลื่อนบิตไปทางซ้ายหรือขวา เพื่อคูณหรือหารด้วยกำลังของสอง
  • 🔁 เสริม: ตัวดำเนินการ ~ จะสลับบิตทุกบิต ดังนั้น 0000 1111 จะกลายเป็น 1111 0000
  • 🤖 ความช่วยเหลือจาก AI: ผู้ช่วย AI และ GitHub Copilot สร้างและอธิบายตรรกะบิตมาสก์และการเลื่อนบิตได้อย่างรวดเร็ว

bitwise Operaทอร์สใน C

Bitwise คืออะไร Operaทอร์?

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

ต่อไปนี้คือรายการตัวดำเนินการบิตที่จัดทำโดยภาษาการเขียนโปรแกรม 'C':

OperaTor ความหมาย
& ตัวดำเนินการ AND ตามบิต
| ตัวดำเนินการแบบบิตต่อบิต OR
^ ตัวดำเนินการ OR เฉพาะตามบิต
~ ส่วนเสริมของ Binary One Operator เป็นตัวดำเนินการแบบยูนารี
<< ผู้ควบคุมกะเกียร์ซ้าย
>> ผู้ควบคุมการเลื่อนเกียร์ขวา

ตัวดำเนินการบิตไม่สามารถนำไปใช้กับชนิดข้อมูลพื้นฐาน เช่น float, double ได้โดยตรง โปรดจำไว้เสมอว่าตัวดำเนินการบิตส่วนใหญ่ใช้กับชนิดข้อมูลพื้นฐาน... ประเภทข้อมูลจำนวนเต็ม เนื่องจากความเข้ากันได้ของมัน

ตัวดำเนินการลอจิคัลแบบบิตจะทำงานกับข้อมูลทีละบิต โดยเริ่มจากบิตที่มีนัยสำคัญน้อยที่สุด นั่นคือ บิต LSB ที่เป็นบิตทางขวาสุด และทำงานต่อไปจนถึง MSB (บิตที่สำคัญที่สุด) ซึ่งเป็นบิตทางซ้ายสุด

ผลลัพธ์ของการคำนวณของตัวดำเนินการเชิงตรรกะระดับบิตจะแสดงอยู่ในตารางด้านล่าง

x y เอ็กซ์แอนด์วาย x | ย x ^ ย
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

Bitwise และ

นี่คือตัวดำเนินการเชิงตรรกะแบบบิตที่ใช้กันทั่วไปที่สุดตัวหนึ่ง ซึ่งแสดงด้วยเครื่องหมายแอมเปอร์แซนด์ตัวเดียว (&) โดยนิพจน์จำนวนเต็มสองตัวจะเขียนไว้ที่แต่ละด้านของตัวดำเนินการ (&)
ผลลัพธ์ของการดำเนินการ AND แบบบิตจะเป็น 1 หากทั้งสองบิตมีค่าเป็น 1 ในกรณีอื่น ผลลัพธ์จะเป็น 0 เสมอ

ลองพิจารณาว่าเรามี 2 ตัวแปร op1 และ op2 โดยมีค่าดังนี้:

Op1 = 0000 1101
Op2 = 0001 1001

ผลลัพธ์ของการดำเนินการ AND กับตัวแปร op1 และ op2 จะเป็น

Result = 0000 1001

ดังที่เราเห็น มีการเปรียบเทียบตัวแปรสองตัวทีละนิด เมื่อใดก็ตามที่ค่าของบิตในตัวแปรทั้งสองเป็น 1 ผลลัพธ์จะเป็น 1 หรือไม่ก็ 0

Bitwise หรือ

แสดงด้วยเครื่องหมายแท่งแนวตั้งตัวเดียว (|) และนิพจน์จำนวนเต็มสองตัวเขียนไว้ที่แต่ละด้านของตัวดำเนินการ (|)

ผลลัพธ์ของการดำเนินการแบบบิต OR จะเป็น 1 ถ้านิพจน์อย่างน้อยหนึ่งรายการมีค่าเป็น 1 มิฉะนั้น ผลลัพธ์จะเป็น 0 เสมอ

ลองพิจารณาว่าเรามี 2 ตัวแปร op1 และ op2 โดยมีค่าดังนี้:

Op1 = 0000 1101
Op2 = 0001 1001

ผลลัพธ์ของการดำเนินการ OR บนตัวแปร op1 และ op2 จะเป็น

Result = 0001 1101

ดังที่เราเห็น มีการเปรียบเทียบตัวแปรสองตัวทีละนิด เมื่อใดก็ตามที่ค่าของบิตในตัวแปรตัวใดตัวหนึ่งเป็น 1 ผลลัพธ์จะเป็น 1 หรือไม่ก็ 0

Bitwise พิเศษหรือ

แทนด้วยสัญลักษณ์ (^) โดยเขียนนิพจน์จำนวนเต็มสองตัวไว้ที่แต่ละด้านของตัวดำเนินการ (^)

ผลลัพธ์ของการดำเนินการ Exclusive-OR แบบบิตต่อบิตจะเป็น 1 ถ้ามีเพียงนิพจน์เดียวเท่านั้นที่มีค่าเป็น 1 มิฉะนั้น ผลลัพธ์จะเป็น 0 เสมอ

ลองพิจารณาว่าเรามี 2 ตัวแปร op1 และ op2 โดยมีค่าดังนี้:

Op1 = 0000 1101
Op2 = 0001 1001

ผลลัพธ์ของการดำเนินการ XOR บนตัวแปร op1 และ op2 จะเป็น

Result = 0001 0100

ดังที่เราเห็น มีการเปรียบเทียบตัวแปรสองตัวทีละนิด เมื่อใดก็ตามที่มีตัวแปรเพียงตัวเดียวเก็บค่า 1 ผลลัพธ์จะเป็น 0 มิฉะนั้น 0 จะเป็นผลลัพธ์

ให้เราเขียนโปรแกรมง่ายๆ ที่แสดงตัวดำเนินการเชิงตรรกะแบบบิต

#include <stdio.h>
int main() 
{
int a = 20;	/* 20 = 010100 */  
int b = 21;	/* 21 = 010101 */
int c = 0;           

c = a & b;       /* 20 = 010100 */ 
printf("AND - Value of c is %d\n", c );

c = a | b;       /* 21 = 010101 */
printf("OR - Value of c is %d\n", c );

c = a ^ b;       /* 1 = 0001 */
printf("Exclusive-OR - Value of c is %d\n", c );

getch();
}

Output:

AND - Value of c is 20
OR - Value of c is 21
Exclusive-OR - Value of c is 1

ตัวดำเนินการเลื่อนระดับบิต

ตัวดำเนินการเลื่อนบิตใช้สำหรับย้าย/เลื่อนรูปแบบบิตไปทางด้านซ้ายหรือด้านขวา ซ้ายและขวาเป็นตัวดำเนินการเลื่อนสองแบบที่ภาษา 'C' มีให้ ซึ่งแสดงได้ดังนี้:

Operand << n (Left Shift)
Operand >> n (Right Shift)

ที่นี่

  • ตัวดำเนินการคือนิพจน์จำนวนเต็มที่เราต้องดำเนินการเลื่อน
  • 'n' คือจำนวนตำแหน่งบิตทั้งหมดที่ต้องเลื่อนในนิพจน์จำนวนเต็ม

การเลื่อนไปทางซ้ายจะเลื่อนบิตจำนวน n บิตไปทางด้านซ้าย บิตที่อยู่ซ้ายสุดในนิพจน์จะถูกดึงออกมา และบิต n บิตที่มีค่า 0 จะถูกเติมไว้ทางด้านขวา

การเลื่อนไปทางขวาจะเลื่อนบิตจำนวน n บิตไปทางขวา บิตจำนวน n บิตที่อยู่ขวาสุดในนิพจน์จะถูกดึงออกมา และค่า 0 จะถูกเติมไว้ทางด้านซ้าย

ตัวอย่าง: x เป็นนิพจน์จำนวนเต็มที่มีข้อมูล 1111 หลังจากดำเนินการเลื่อน ผลลัพธ์จะเป็นดังนี้:

x << 2 (left shift) = 1111<<2 = 1100
x>>2 (right shift) = 1111>>2 = 0011

Shiftตัวดำเนินการ s สามารถนำมาผสมผสานกันได้ จากนั้นจึงนำไปใช้เพื่อยกตัวอย่างtract ข้อมูลจากนิพจน์จำนวนเต็ม มาเขียนโปรแกรมเพื่อสาธิตการใช้ตัวดำเนินการเลื่อนบิตกัน

#include <stdio.h>
int main() {
int a = 20;	/* 20 = 010100 */  
int c = 0;           

c = a << 2;	/* 80 = 101000 */
printf("Left shift - Value of c is %d\n", c );

c = a >> 2;	/*05 = 000101 */
printf("Right shift - Value of c is %d\n", c );
return 0;
}

Output:

Left shift - Value of c is 80
Right shift - Value of c is 5

หลังจากดำเนินการเลื่อนไปทางซ้าย ค่าจะกลายเป็น 80 ซึ่งมีค่าเทียบเท่าในไบนารีคือ 101000

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

ตัวดำเนินการเสริมบิต

ตัวประกอบบิตยังเรียกอีกอย่างว่าตัวดำเนินการตัวประกอบหนึ่ง เนื่องจากตัวประกอบนี้รับค่าหรือตัวดำเนินการเพียงตัวเดียวเสมอ เป็นตัวดำเนินการยูนารี

เมื่อเราดำเนินการเสริมกับบิตใดๆ 1 ทั้งหมดจะกลายเป็น 0 และในทางกลับกัน

หากเรามีนิพจน์จำนวนเต็มที่ประกอบด้วย 0000 1111 หลังจากดำเนินการเติมเต็มบิต ค่าจะกลายเป็น 1111 0000

ตัวดำเนินการเติมเต็มบิตจะถูกแสดงด้วยสัญลักษณ์ทิลดา (~)

ให้เราเขียนโปรแกรมที่สาธิตการใช้งานตัวดำเนินการเสริมบิต

#include <stdio.h>
int main() {
int a = 10;	/* 10 = 1010 */  
int c = 0;           
c = ~(a);      
printf("Complement - Value of c is %d\n", c );
return 0;
}

Output:

Complement - Value of c is -11

นี่คือโปรแกรมอีกโปรแกรมหนึ่ง พร้อมตัวอย่างการใช้งานตัวดำเนินการทั้งหมดที่ได้กล่าวถึงไปแล้ว:

#include <stdio.h>
main() {
unsigned int x = 48;	/* 48 = 0011 0000 */  
unsigned int y = 13;	/* 13 = 0000 1101 */
int z = 0;           

z =x & y;       /* 0 = 0000 0000 */ 
printf("Bitwise AND Operator - x & y = %d\n", z );

z = x | y;       /* 61 = 0011 1101 */
printf("Bitwise OR Operator - x | y = %d\n", z );

z= x^y;       /* 61 = 0011 1101 */
printf("Bitwise XOR Operator- x^y= %d\n", z);

z = ~x;          /*-49 = 11001111 */
printf("Bitwise One's Complement Operator - ~x = %d\n", z);

z = x << 2;     /* 192 = 1100 0000 */
printf("Bitwise Left Shift Operator x << 2= %d\n", z );

z= x >> 2;     /* 12 = 0000 1100 */
printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}

หลังจากที่เราคอมไพล์และรันโปรแกรมแล้ว จะได้ผลลัพธ์ดังต่อไปนี้:

Bitwise AND Operator - x & y = 0
Bitwise OR Operator - x | y = 61
Bitwise XOR Operator- x^y= 61
Bitwise One's Complement Operator - ~x = -49
Bitwise Left Shift Operator x << 2= 192
Bitwise Right Shift Operator x >> 2= 12

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

ตัวดำเนินการ AND ระดับบิต (&) ทำงานกับบิตแต่ละบิตและส่งคืนค่าจำนวนเต็ม ในขณะที่ตัวดำเนินการ AND ระดับตรรกะ (&&) ทดสอบนิพจน์ทั้งหมดและส่งคืนค่าบูลีนจริงหรือเท็จเพียงค่าเดียว

Shift 1. เพื่อสร้างมาสก์: ตั้งค่าด้วยค่า | (1 << n), ล้างด้วยค่า & ~(1 << n), และสลับด้วยค่า ^ (1 << n)

การเลื่อนบิตไปทางซ้ายด้วยค่า n จะคูณค่าที่ไม่มีเครื่องหมายด้วย 2 ยกกำลัง n ส่วนการเลื่อนบิตไปทางขวาจะหารด้วยค่าเดียวกัน ดังนั้นคอมไพเลอร์จึงใช้การเลื่อนบิตเพื่อเพิ่มความเร็ว

ตรวจสอบตัวเลขและ 1 บิตต่ำสุดจะส่งคืนค่า 1 สำหรับค่าคี่และ 0 สำหรับค่าคู่ ซึ่งเร็วกว่าตัวดำเนินการโมดูลัส

เฟิร์มแวร์ฝังตัว ไดรเวอร์ การเข้ารหัส การบีบอัด กราฟิก และเครือข่าย ใช้สิ่งเหล่านี้ในการจัดเก็บแฟล็ก อ่านรีจิสเตอร์ฮาร์ดแวร์ สร้างมาสก์การอนุญาต และเร่งความเร็วในการคำนวณทางคณิตศาสตร์

Shift ตัวดำเนินการผูกมัดแน่นกว่าตัวดำเนินการเชิงสัมพันธ์ ในขณะที่ &, ^ และ | อยู่ต่ำกว่าความเท่าเทียมกัน แต่สูงกว่า && และ || ทางตรรกะ ดังนั้นควรใส่เครื่องหมายวงเล็บเพื่อความปลอดภัย

ใช่แล้ว ผู้ช่วยเขียนโค้ด AI จะเขียนมาสก์และชิฟต์จากข้อความแจ้ง อธิบายคำเติมเต็มเชิงลบ และแปลงตัวอย่างไบนารีให้เป็นภาษา C ที่ใช้งานได้จริง ทดสอบผลลัพธ์เสมอ

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

สรุปโพสต์นี้ด้วย: