Bitwise Operators trong C: AND, OR, XOR, Shift & Bổ sung
Bitwise là gì Operaxoắn?
Bitwise Operaxoắn được sử dụng để thao tác dữ liệu ở cấp độ bit, còn được gọi là lập trình cấp độ bit. Bitwise hoạt động trên một hoặc nhiều mẫu bit hoặc số nhị phân ở cấp độ bit riêng lẻ của chúng. Chúng được sử dụng trong các phép tính số để làm cho quá trình tính toán nhanh hơn.
Sau đây là danh sách các toán tử bitwise được cung cấp bởi ngôn ngữ lập trình 'C':
Operator | Ý nghĩa |
---|---|
& | Toán tử AND bitwise |
| | Toán tử OR bitwise |
^ | Toán tử OR loại trừ bitwise |
~ | Phần bù của nhị phân Operator là toán tử một ngôi |
<< | Toán tử dịch trái |
>> | Toán tử dịch chuyển phải |
Các toán tử bitwise không thể được áp dụng trực tiếp vào các kiểu dữ liệu nguyên thủy như float, double, v.v. Hãy luôn nhớ một điều rằng các toán tử bitwise chủ yếu được sử dụng với kiểu dữ liệu số nguyên vì tính tương thích của nó.
Các toán tử logic bitwise xử lý dữ liệu theo từng bit, bắt đầu từ bit ít quan trọng nhất, tức là bit LSB là bit ngoài cùng bên phải, tiến tới bit MSB (Bit quan trọng nhất) là bit ngoài cùng bên trái.
Kết quả tính toán các toán tử logic bit được hiển thị trong bảng dưới đây.
x | y | x & y | x | ở đó | x^y |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
Bitwise VÀ
Đây là một trong những toán tử logic bitwise được sử dụng phổ biến nhất. Nó được biểu diễn bằng một dấu thăng (&). Hai biểu thức số nguyên được viết ở mỗi bên của toán tử (&).
Kết quả của phép toán bitwise AND là 1 nếu cả hai bit đều có giá trị là 1; nếu không, kết quả luôn là 0.
Giả sử ta có 2 biến op1 và op2 có giá trị như sau:
Op1 = 0000 1101 Op2 = 0001 1001
Kết quả của phép toán AND trên các biến op1 và op2 sẽ là
Result = 0000 1001
Như chúng ta có thể thấy, hai biến được so sánh từng chút một. Bất cứ khi nào giá trị của một bit trong cả hai biến là 1 thì kết quả sẽ là 1 hoặc ngược lại là 0.
Bitwise HOẶC
Nó được biểu thị bằng một dấu thanh dọc duy nhất (|). Hai biểu thức số nguyên được viết ở mỗi bên của toán tử (|).
Kết quả của phép toán bitwise OR là 1 nếu ít nhất một biểu thức có giá trị là 1; nếu không, kết quả luôn là 0.
Giả sử ta có 2 biến op1 và op2 có giá trị như sau:
Op1 = 0000 1101 Op2 = 0001 1001
Kết quả của phép toán OR trên biến op1 và op2 sẽ là
Result = 0001 1101
Như chúng ta có thể thấy, hai biến được so sánh từng chút một. Bất cứ khi nào giá trị của một bit trong một trong các biến là 1 thì kết quả sẽ là 1 hoặc ngược lại là 0.
Bitwise loại trừ HOẶC
Nó được biểu thị bằng ký hiệu (^). Hai biểu thức số nguyên được viết ở mỗi bên của toán tử (^).
Kết quả của phép toán Bitwise Exclusive-OR là 1 nếu chỉ có một biểu thức có giá trị là 1; nếu không, kết quả luôn là 0.
Giả sử ta có 2 biến op1 và op2 có giá trị như sau:
Op1 = 0000 1101 Op2 = 0001 1001
Kết quả của phép toán XOR trên các biến op1 và op2 sẽ là
Result = 0001 0100
Như chúng ta có thể thấy, hai biến được so sánh từng chút một. Bất cứ khi nào chỉ có một biến giữ giá trị 1 thì kết quả là 0, còn lại 0 sẽ là kết quả.
Chúng ta hãy viết một chương trình đơn giản để minh họa các toán tử logic bit.
#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(); }
Đầu ra:
AND - Value of c is 20 OR - Value of c is 21 Exclusive-OR - Value of c is 1
Toán tử dịch chuyển bitwise
Các toán tử dịch chuyển bitwise được sử dụng để di chuyển/dịch chuyển các mẫu bit sang bên trái hoặc bên phải. Trái và phải là hai toán tử dịch chuyển được cung cấp bởi 'C' được biểu diễn như sau:
Operand << n (Left Shift) Operand >> n (Right Shift)
Ở đây,
- toán hạng là một biểu thức số nguyên mà chúng ta phải thực hiện phép dịch chuyển trên đó.
- 'n' là tổng số vị trí bit mà chúng ta phải dịch chuyển trong biểu thức số nguyên.
Thao tác dịch trái sẽ dịch số bit 'n' sang bên trái. Các bit ngoài cùng bên trái trong biểu thức sẽ xuất hiện và n bit có giá trị 0 sẽ được điền vào phía bên phải.
Thao tác dịch chuyển bên phải sẽ chuyển số bit 'n' sang bên phải. Các bit 'n' ngoài cùng bên phải trong biểu thức sẽ xuất hiện và giá trị 0 sẽ được điền vào phía bên trái.
Ví dụ: x là biểu thức số nguyên có dữ liệu 1111. Sau khi thực hiện thao tác shift kết quả sẽ là:
x << 2 (left shift) = 1111<<2 = 1100 x>>2 (right shift) = 1111>>2 = 0011
ShiftCác toán tử s có thể được kết hợp sau đó có thể được sử dụng để trích xuất dữ liệu từ biểu thức số nguyên. Chúng ta hãy viết một chương trình để chứng minh việc sử dụng các toán tử dịch bitwise.
#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; }
Đầu ra:
Left shift - Value of c is 80 Right shift - Value of c is 5
Sau khi thực hiện thao tác dịch trái, giá trị sẽ trở thành 80 với số nhị phân tương đương là 101000.
Sau khi thực hiện thao tác dịch chuyển phải, giá trị sẽ trở thành 5 có số nhị phân tương đương là 000101.
Toán tử bổ sung bitwise
Phép bù bitwise còn được gọi là toán tử bù một vì nó luôn chỉ lấy một giá trị hoặc một toán hạng. Đây là toán tử một ngôi.
Khi chúng ta thực hiện phép bù trên bất kỳ bit nào, tất cả các số 1 sẽ trở thành số 0 và ngược lại.
Nếu chúng ta có một biểu thức số nguyên chứa 0000 1111 thì sau khi thực hiện phép toán bù bit, giá trị sẽ trở thành 1111 0000.
Toán tử bổ sung bit được biểu thị bằng ký hiệu dấu ngã (~).
Chúng ta hãy viết một chương trình minh họa cách triển khai toán tử bổ sung bit.
#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; }
Đầu ra:
Complement - Value of c is -11
Đây là một chương trình khác, với ví dụ về tất cả các thao tác được thảo luận cho đến nay:
#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 );}
Sau khi biên dịch và chạy chương trình, kết quả sẽ như sau:
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
Tổng kết
- Toán tử bitwise là tập hợp toán tử đặc biệt được cung cấp bởi 'C.'
- Chúng được sử dụng trong lập trình cấp độ bit.
- Các toán tử này được sử dụng để thao tác các bit của một biểu thức số nguyên.
- Logic, dịch chuyển và bù là ba loại toán tử bitwise.
- Toán tử bổ sung bit được sử dụng để đảo ngược các bit của một biểu thức.