Cho đến bây giờ trong loạt bài hướng dẫn lập trình C đang diễn ra này, chúng ta đã thảo luận về nhiều loại toán tử, như số học, logic, quan hệ và phép gán. Tuy nhiên, có một loại toán tử khác rất cần thiết cho ngôn ngữ lập trình C. Chúng ta đang nói về các toán tử bitwise.
Như bạn có thể đã biết, mọi biến bạn sử dụng trong chương trình C của mình đều được lưu trữ dưới dạng byte trong bộ nhớ. Hơn nữa, mỗi byte này được chia thành 8 bit. Một bit có thể là 1 hoặc 0. Ví dụ, nếu a là một số nguyên ngắn (chiếm hai byte) có giá trị là 1, thì ở cấp độ bộ nhớ, đây là cách a được biểu diễn:
Tương tự, nếu b là 3, thì đây là cách nó được biểu diễn trong bộ nhớ:
Lưu ý: Truy cậptại đây để tìm hiểu thêm về cách các số nguyên được biểu diễn dưới dạng bit trong bộ nhớ.
Các toán tử Bitwise mà chúng ta sắp thảo luận ở đây hoạt động trên các bit này. Hãy bắt đầu với toán tử bitwise AND, được biểu diễn bằng &. Nó lấy hai biểu diễn nhị phân có độ dài bằng nhauvà thực hiện phép toán AND logic trên các bit tương ứng.
Trong phép toán AND logic, chỉ khi cả hai bit tương ứng đều là 1, thì kết quả là 1. Nếu không, kết quả là 0. Vì vậy, nếu bạn thực hiện như sau:
Trong đó 'a' là 1 và 'b' là 3 (như đã mô tả ở phần đầu của hướng dẫn này), thì phép toán sẽ tạo ra kết quả sau:
Điều này là do nếu bạn thực hiện phép toán AND logic các biểu diễn bit của 'a' và 'b', thì chỉ có bit ngoài cùng bên phải vẫn là '1' và tất cả các bit khác trở thành '0'. Ở dạng số nguyên (hay chính xác hơn là dạng thập phân), biểu diễn bit này sẽ là '1'.
Đây là mã cho phép toán này:
Và đây là đầu ra của mã này:
Giống như &, còn có các toán tử bitwise khác. Sau đây là danh sách đầy đủ:
Toán tử OR (|) thực hiện phép toán OR bao gồm logic trên các bit tương ứng của toán hạng của nó - nếu bất kỳ bit nào là 1, bit kết quả cũng là 1, nếu không thì bit kết quả là 0. Toán tử OR loại trừ (hoặc XOR) hoạt động khá giống với toán tử OR, chỉ khác là bit kết quả là 0 nếu cả hai bit đều là 0 hoặc 1.
Toán tử dịch trái dịch các bit số lần được chỉ định bởi toán hạng thứ hai. Ví dụ, dòng sau đảm bảo các bit của 'a' được dịch sang trái 3 lần.
Như bạn có thể đã biết, mọi biến bạn sử dụng trong chương trình C của mình đều được lưu trữ dưới dạng byte trong bộ nhớ. Hơn nữa, mỗi byte này được chia thành 8 bit. Một bit có thể là 1 hoặc 0. Ví dụ, nếu a là một số nguyên ngắn (chiếm hai byte) có giá trị là 1, thì ở cấp độ bộ nhớ, đây là cách a được biểu diễn:
Mã:
00000000 00000001
Mã:
00000000 00000011
Các toán tử Bitwise mà chúng ta sắp thảo luận ở đây hoạt động trên các bit này. Hãy bắt đầu với toán tử bitwise AND, được biểu diễn bằng &. Nó lấy hai biểu diễn nhị phân có độ dài bằng nhauvà thực hiện phép toán AND logic trên các bit tương ứng.
Trong phép toán AND logic, chỉ khi cả hai bit tương ứng đều là 1, thì kết quả là 1. Nếu không, kết quả là 0. Vì vậy, nếu bạn thực hiện như sau:
Mã:
a & b
Mã:
00000000 00000001
Đây là mã cho phép toán này:
Mã:
#include
int main()
{
short a = 1;
short b = 3;
printf("a & b = %i", a&b);
return 0;
}
Mã:
a & b = 1
Mã:
& - AND
| - bao gồm OR
^ - loại trừ OR
> - dịch phải
~ - phần bù của một hoặc KHÔNG
Toán tử dịch trái dịch các bit số lần được chỉ định bởi toán hạng thứ hai. Ví dụ, dòng sau đảm bảo các bit của 'a' được dịch sang trái 3 lần.
Mã:
a