Toán tử bitwise không phải là khái niệm xa lạ đối với những lập trình viên C++. Với 6 thao tác toán tử được gọi là toán tử bitwise, C++ mang đến cho chúng ta khả năng thao tác trực tiếp trên các bit của số. Trong bài viết này, chúng ta sẽ khám phá và ứng dụng các toán tử bitwise này.
Toán Tử Dịch Bit Trái và Dịch Bit Phải
Trong phép dịch bit trái, chúng ta sẽ dịch chuyển các bit sang trái với số lượng bit cần dịch chuyển như là toán hạng bên phải của phép toán. Khi chúng ta viết x << 1
, nghĩa là chúng ta dịch chuyển số x
sang trái 1 bit. Các bit mới dịch chuyển sẽ được điền bằng 0. Ví dụ:
0011 << 1 == 0110
0011 << 2 == 1100
0011 << 3 == 1000
Tương tự, phép dịch bit phải cũng hoạt động tương tự như phép dịch bit trái, nhưng ngược lại. Ví dụ:
1100 >> 1 == 0110
1100 >> 2 == 0011
1100 >> 3 == 0001
Toán Tử NOT
Toán tử NOT (~) là toán tử bitwise dễ hiểu nhất trong số các toán tử bitwise khác. Nó đơn giản chỉ là lật từng bit từ 0 sang 1 hoặc ngược lại. Lưu ý rằng kết quả của phép NOT phụ thuộc vào kích thước của kiểu dữ liệu bạn đang sử dụng. Ví dụ:
~0100 == 1011
~0000 0100 == 1111 1011
Toán Tử OR
Toán tử OR (|) thực hiện phép OR logic giữa từng cặp bit. Kết quả của phép OR logic là 1 nếu ít nhất một trong hai bit là 1. Ví dụ:
0b0101 | 0b0110 == 0b0111
Chúng ta có thể sử dụng toán tử OR trên nhiều biểu thức cùng lúc, ví dụ:
0b0111 | 0b0011 | 0b0001 == 0b0111
Toán Tử AND
Toán tử AND (&) thực hiện phép AND logic giữa từng cặp bit. Kết quả của phép AND logic là 1 chỉ khi cả hai bit đều là 1. Ví dụ:
0b0101 & 0b0110 == 0b0100
Chúng ta cũng có thể sử dụng toán tử AND trên nhiều biểu thức cùng lúc, ví dụ:
0b0001 & 0b0011 & 0b0111 == 0b0001
Toán Tử XOR
Toán tử XOR (^) thực hiện phép XOR logic giữa từng cặp bit. Kết quả của phép XOR logic là 1 chỉ khi một trong hai bit là 1, nhưng không cả hai cùng là 1. Ví dụ:
0b0110 ^ 0b0011 == 0b0101
Chúng ta cũng có thể sử dụng toán tử XOR trên nhiều biểu thức cùng lúc, ví dụ:
0b0001 ^ 0b0011 ^ 0b0111 == 0b0101
Phép Gán Toán Tử Bitwise
Tương tự như các toán tử gán số học, C++ cung cấp các toán tử gán bit để thuận tiện sửa đổi biến. Ví dụ, phép gán x = x >> 1
có thể được viết thành x >>= 1
.
std::bitset<4> bits { 0b0100 };
bits >>= 1;
std::cout << bits;
Kết quả của đoạn code này là 0010
.
Những khái niệm về toán tử bitwise đã trở nên rõ ràng hơn qua bài viết này. Hi vọng rằng các ví dụ và cách ứng dụng trong ngôn ngữ lập trình C++ sẽ giúp bạn nắm vững hơn về toán tử bitwise và áp dụng chúng trong công việc lập trình của mình.