Toán tử Bitwise trong Python được sử dụng để thực hiện các phép toán trên các bit của số nguyên. Các số nguyên được chuyển đổi sang định dạng nhị phân, sau đó các phép toán được thực hiện từng bit một, đó là lý do chúng được gọi là “bitwise”.

Các toán tử này chỉ hoạt động trên các số nguyên và kết quả cuối cùng được trả về dưới định dạng số thập phân. Python bitwise operators còn được gọi là binary operators (toán tử nhị phân).
Các toán tử Bitwise trong Python
Có 6 toán tử bitwise trong Python. Bảng dưới đây cung cấp chi tiết ngắn gọn về chúng:
| Toán tử | Mô tả | Ví dụ đơn giản |
|---|---|---|
| & | Toán tử AND bit | 10 & 7 = 2 |
| ` | ` | Toán tử OR bit |
| ^ | Toán tử XOR bit | 10 ^ 7 = 13 |
| ~ | Toán tử bổ sung 1 bit | ~10 = -11 |
| << | Toán tử dịch bit sang trái | 10 << 2 = 40 |
| >> | Toán tử dịch bit sang phải | 10 >> 1 = 5 |
1. Toán tử Bitwise AND (&)
Toán tử bitwise AND trong Python trả về 1 nếu cả hai bit ở cùng vị trí đều là 1, ngược lại thì trả về 0.
>>> 10&7
2
>>>

2. Toán tử Bitwise OR (|)
Toán tử bitwise OR trong Python trả về 1 nếu một trong hai bit ở cùng vị trí là 1. Nếu cả hai bit đều là 0, nó sẽ trả về 0.
>>> 10|7
15
>>>

3. Toán tử Bitwise XOR (^)
Toán tử bitwise XOR trong Python trả về 1 nếu một trong hai bit là 0 và bit còn lại là 1. Nếu cả hai bit đều là 0 hoặc 1 (tức là chúng giống nhau), nó sẽ trả về 0.
>>> 10^7
13
>>>

4. Toán tử Bitwise Ones’ Complement (~)
Toán tử Ones’ complement của một số ‘A’ trong Python sẽ tương đương với -(A+1).
>>> ~10
-11
>>> ~-10
9
>>>

5. Toán tử Bitwise Left Shift (<<)
Toán tử bitwise left shift trong Python dịch chuyển các bit của toán hạng bên trái sang phía bên trái một số lần bằng với giá trị của toán hạng bên phải. Nói một cách đơn giản, các số 0 sẽ được thêm vào cuối số nhị phân
>>> 10 << 2
40
>>>

6. Toán tử Bitwise Right Shift (>>)
Toán tử bitwise right shift trong Python hoàn toàn ngược lại với toán tử left shift. Các bit của toán hạng bên trái sẽ được dịch chuyển sang phía bên phải một số lần bằng với giá trị của toán hạng bên phải. Nói một cách đơn giản, các bit ở phía bên phải sẽ bị loại bỏ.
>>> 10 >> 2
2
>>>

Nạp chồng toán tử Bitwise trong Python
Python hỗ trợ nạp chồng toán tử. Có nhiều phương thức mà chúng ta có thể triển khai để hỗ trợ các toán tử bitwise cho các custom objects của mình.
| Toán tử Bitwise | Phương thức để triển khai |
|---|---|
| & | and(self, other) |
| ` | ` |
| ^ | xor(self, other) |
| ~ | invert(self) |
| << | lshift(self, other) |
| >> | rshift(self, other) |
Ví dụ về nạp chồng toán tử bitwise cho một custom object:
class Data:
id = 0
def __init__(self, i):
self.id = i
def __and__(self, other):
print('Bitwise AND operator overloaded')
if isinstance(other, Data):
return Data(self.id & other.id)
else:
raise ValueError('Argument must be object of Data')
def __or__(self, other):
print('Bitwise OR operator overloaded')
if isinstance(other, Data):
return Data(self.id | other.id)
else:
raise ValueError('Argument must be object of Data')
def __xor__(self, other):
print('Bitwise XOR operator overloaded')
if isinstance(other, Data):
return Data(self.id ^ other.id)
else:
raise ValueError('Argument must be object of Data')
def __lshift__(self, other):
print('Bitwise Left Shift operator overloaded')
if isinstance(other, int):
return Data(self.id << other)
else:
raise ValueError('Argument must be integer')
def __rshift__(self, other):
print('Bitwise Right Shift operator overloaded')
if isinstance(other, int):
return Data(self.id >> other)
else:
raise ValueError('Argument must be integer')
def __invert__(self):
print('Bitwise Ones Complement operator overloaded')
return Data(~self.id)
def __str__(self):
return f'Data[{self.id}]'
d1 = Data(10)
d2 = Data(7)
print(f'd1&d2 = {d1&d2}')
print(f'd1|d2 = {d1|d2}')
print(f'd1^d2 = {d1^d2}')
print(f'd1<<2 = {d1<<2}')
print(f'd1>>2 = {d1>>2}')
print(f'~d1 = {~d1}')
Kết quả
Bitwise AND operator overloaded
d1&d2 = Data[2]
Bitwise OR operator overloaded
d1|d2 = Data[15]
Bitwise XOR operator overloaded
d1^d2 = Data[13]
Bitwise Left Shift operator overloaded
d1<<2 = Data[40]
Bitwise Right Shift operator overloaded
d1>>2 = Data[2]
Bitwise Ones Complement operator overloaded
~d1 = Data[-11]
Nếu bạn chưa quen với định dạng chuỗi mới, vui lòng đọc thêm về f-strings trong Python.
Tổng kết
Toán tử bitwise trong Python chủ yếu được sử dụng trong các phép tính toán học. Chúng ta cũng có thể triển khai các phương thức cụ thể để hỗ trợ các toán tử bitwise cho các lớp tùy chỉnh của mình.