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

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 สามารถรวมกันได้ จากนั้นจึงนำไปใช้ในการดึงข้อมูลจากนิพจน์จำนวนเต็มได้ ให้เราเขียนโปรแกรมเพื่อสาธิตการใช้ตัวดำเนินการเลื่อนตามบิต

#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

สรุป

  • ตัวดำเนินการระดับบิตคือตัวดำเนินการพิเศษที่กำหนดโดย 'C.'
  • ใช้ในการเขียนโปรแกรมระดับบิต
  • ตัวดำเนินการเหล่านี้ใช้เพื่อจัดการบิตของนิพจน์จำนวนเต็ม
  • ตัวดำเนินการเชิงบิตมี 3 ประเภท ได้แก่ ประเภทตรรกะ ประเภทการเลื่อน และประเภทการเติมเต็ม
  • ตัวดำเนินการเสริมบิตใช้เพื่อย้อนกลับบิตของนิพจน์