Các
Thao Tác trên Bit
Bản chất máy tính chỉ hiểu được mã nhị phân dưới dạng dãy số 0 và
1. Mỗi con số như vậy được gọi là một bit. Ngôn ngữ lập trình có cung cấp cho
chúng ta những toán tử để chúng ta có thể thao tác trên bit như các phép
cơ bản and, or, not, xor, dịch trái, dịch phải. Trong bài viết này tôi sẽ
cùng các bạn làm quen cũng như thực hành với những toán tử thao tác trên bit
hay còn được gọi là bitwise.
Các toán thử thao tác trên bit (bitwise)
Dữ liệu lưu trữ trong máy tính dưới dạng nhị phân 0 1, ví dụ:
unsigned char a = 12;
Thì lưu trữ dưới bộ nhớ là: 0000 1100
Tương tự
unsigned int b = 95;
Lưu trữ b dưới bộ nhớ là: 0000 0000 0000 0000 0000 0000 0101 1111
Không gian lưu trữ kiểu unsigned int
lớn hơn unsigned char
do unsigned int
dùng
32 bits để biểu diễn còn unsigned char
dùng 8 bits để biểu diễn.
Các toán tử thao tác trên bit
Phép
thao tác trên bit |
Kí hiệu |
Phép
AND |
& |
Phép
OR |
| |
Phép
phủ định NOT |
~ |
Phép
XOR |
^ |
Phép dịch
trái - Shift left |
<< |
Phép dịch
phải - Shift right |
>> |
Phép AND
Kí hiệu: &
Bảng chân trị
A |
B |
A
& B |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
Phép AND chỉ có giá trị 1 nếu cả hai toán hạng đều
có giá trị 1.
Ví dụ:
A 0000 1100
B 0101 0101
C = A & B 0000 0100
Phép OR
Kí hiệu: |
Bảng chân trị
A |
B |
A | B |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
Phép OR chỉ có giá trị 0 nếu cả hai toán hạng đều có giá
trị 0.
Ví dụ
A 0000 1100
B 0101 0101
C = A | B 0101 1101
Phép phủ định NOT
Kí hiệu: ~
Bảng chân trị
A |
~A |
0 |
1 |
1 |
0 |
Phép NOT đảo bit 1 thành 0 và ngược lại.
Ví dụ
A 0000 1100
B = ~A 1111 0011
Phép XOR
Kí hiệu: ^
Bảng chân trị
A |
B |
A ^ B |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
Phép XOR chỉ có giá trị 0 nếu cả hai toán hạng có cùng giá
trị, cùng là giá trị 1, hay cùng là giá trị 0.
Ví dụ
A 0000 1100
B 0101 0101
C = A ^ B 0101 1001
Phép dịch trái <<
Kí hiệu: <<
Phép dịch trái n bit tương đương với phép nhân cho 2n.
Ví dụ
A 0000 1100
<—
B = A << 2 0011 0000
Phép dịch phải >>
Kí hiệu: >>
Phép dịch phải n bit tương đương với phép chia cho 2n.
Ví dụ
A 0000 1100
—>
B = A >> 2 0000 0011
Các ví dụ thao tác cơ bản trên bit
AND
unsigned char a = 5; // 00000101(5)
unsigned char b = 6; // 00000110(6)
unsigned char c = a & b; // 00000100(4)
OR
unsigned char a = 5; // 00000101(5)
unsigned char b = 6; // 00000110(6)
unsigned char c = a | b; // 00000111(7)
NOT
unsigned char a = 5; // 00000101(5)
unsigned char b = ~a; // 11111010(250)
XOR
unsigned char a = 5; // 00000101(5)
unsigned char b = 6; // 00000110(6)
int c = a ^ b; // 00000011(3)
Dịch trái <<
unsigned char a = 5; // 00000101(5)
unsigned char b = a << 4; // 01010000(80)
Dịch phải >>
unsigned char a = 5; // 00000101(5)
unsigned char b = a >> 1; // 00000010(2)