Python - Toán Tử bitwise

Xin chào các nhà phép thuật Python tương lai! Hôm nay, chúng ta sẽ bắt đầu hành trình thú vị vào thế giới của các toán tử bitwise. Tôi biết bạn có thể suy nghĩ gì: "Toán tử bitwise? Đó có lẽ là điều chỉ những người khoa học máy tính mới quan tâm!" Nhưng hãy tin tôi, việc hiểu các toán tử này có thể rất hữu ích và thậm chí thú vị! Vậy hãy bơi vào và khám phá bí ẩn của các bit và byte cùng nhau.

Python - Bitwise Operators

Toán Tử Bitwise Trong Python

Các toán tử bitwise là các toán tử đặc biệt hoạt động trên các biểu diễn nhị phân của các số. Chúng thao tác trên từng bit, điều này là các đơn vị dữ liệu nhỏ nhất trong việc tính toán. Hãy nghĩ về các bit như các cái chuyển động nhỏ có thể bật (1) hoặc tắt (0).

Trước khi chúng ta bước sâu vào từng toán tử, hãy nhanh chóng xem qua tất cả các toán tử bitwise có sẵn trong Python:

Toán tử Tên Mô tả
& AND Đặt mỗi bit là 1 nếu cả hai bit đều là 1
| OR Đặt mỗi bit là 1 nếu một trong hai bit là 1
^ XOR Đặt mỗi bit là 1 nếu chỉ một trong hai bit là 1
~ NOT Lật ngược tất cả các bit
<< Dịch Trái Dịch trái bằng cách đẩy các số 0 vào từ bên phải
>> Dịch Phải Dịch phải bằng cách đẩy các bản sao của bit bên trái vào từ bên trái

Bây giờ, hãy khám phá từng toán tử này chi tiết hơn.

Toán Tử Bitwise AND Trong Python (&)

Toán tử Bitwise AND (&) so sánh mỗi bit của toán tử đầu tiên với bit tương ứng của toán tử thứ hai. Nếu cả hai bit đều là 1, bit kết quả tương ứng sẽ được đặt là 1. Nếu không, bit kết quả tương ứng sẽ được đặt là 0.

Hãy xem một ví dụ:

a = 5  # nhị phân: 0101
b = 3  # nhị phân: 0011
ket_qua = a & b
print(f"{a} & {b} = {ket_qua}")  # Kết quả: 5 & 3 = 1

Trong ví dụ này, chúng ta đang thực hiện phép AND bitwise giữa 5 (0101 nhị phân) và 3 (0011 nhị phân). Kết quả là 1 (0001 nhị phân).

Đây là cách nó hoạt động:

0101 (5)
& 0011 (3)
----
0001 (1)

Như bạn thấy, chỉ bit bên phải là 1 trong cả hai số, vì vậy chỉ bit đó là 1 trong kết quả.

Toán Tử Bitwise OR Trong Python (|)

Toán tử Bitwise OR (|) so sánh mỗi bit của toán tử đầu tiên với bit tương ứng của toán tử thứ hai. Nếu bất kỳ bit nào là 1, bit kết quả tương ứng sẽ được đặt là 1. Nếu không, bit kết quả tương ứng sẽ được đặt là 0.

Dưới đây là một ví dụ:

a = 5  # nhị phân: 0101
b = 3  # nhị phân: 0011
ket_qua = a | b
print(f"{a} | {b} = {ket_qua}")  # Kết quả: 5 | 3 = 7

Trong trường hợp này, chúng ta đang thực hiện phép OR bitwise giữa 5 và 3. Kết quả là 7 (0111 nhị phân).

Đây là phân tích:

0101 (5)
| 0011 (3)
----
0111 (7)

Kết quả có 1 ở bất kỳ đâu trong các số gốc có 1.

Toán Tử Bitwise XOR Trong Python (^)

Toán tử Bitwise XOR (exclusive OR) (^) so sánh mỗi bit của toán tử đầu tiên với bit tương ứng của toán tử thứ hai. Nếu các bit khác nhau, bit kết quả tương ứng sẽ được đặt là 1. Nếu các bit giống nhau, bit kết quả tương ứng sẽ được đặt là 0.

Hãy xem một ví dụ:

a = 5  # nhị phân: 0101
b = 3  # nhị phân: 0011
ket_qua = a ^ b
print(f"{a} ^ {b} = {ket_qua}")  # Kết quả: 5 ^ 3 = 6

Ở đây, chúng ta đang thực hiện phép XOR bitwise giữa 5 và 3. Kết quả là 6 (0110 nhị phân).

Đây là cách nó hoạt động:

0101 (5)
^ 0011 (3)
----
0110 (6)

Kết quả có 1 ở nơi các bit trong các số gốc khác nhau.

Toán Tử Bitwise NOT Trong Python (~)

Toán tử Bitwise NOT (~) là một toán tử đơn (chỉ có một toán tử) có việc lật các bit của toán tử của nó. Mỗi 0 trở thành 1 và mỗi 1 trở thành 0.

Dưới đây là một ví dụ:

a = 5  # nhị phân: 0101
ket_qua = ~a
print(f"~{a} = {ket_qua}")  # Kết quả: ~5 = -6

Bạn có thể hỏi tại sao kết quả là -6. Điều này là vì Python sử dụng phương pháp hai số đối để biểu diễn các số âm. Trong phương pháp hai số đối, bit bên trái đại diện cho dấu (0 cho dương, 1 cho âm).

Đây là điều gì xảy ra bên dưới mặt:

00000101 (5)
~
11111010 (-6 trong phương pháp hai số đối)

Toán Tử Bitwise Dịch Trái Trong Python (<<)

Toán tử Bitwise Dịch Trái (<<) dịch các bit của toán tử đầu tiên trái theo số lượng vị trí được chỉ định bởi toán tử thứ hai. Các bit mới bên phải được điền với các số 0.

Hãy xem một ví dụ:

a = 5  # nhị phân: 0101
b = 1
ket_qua = a << b
print(f"{a} << {b} = {ket_qua}")  # Kết quả: 5 << 1 = 10

Trong trường hợp này, chúng ta đang dịch các bit của 5 sang trái bởi 1 vị trí. Kết quả là 10 (1010 nhị phân).

Đây là điều gì xảy ra:

0101 (5)
Dịch trái bởi 1
1010 (10)

Mỗi dịch trái hiệu quả là nhân số này với 2.

Toán Tử Bitwise Dịch Phải Trong Python (>>)

Toán tử Bitwise Dịch Phải (>>) dịch các bit của toán tử đầu tiên phải theo số lượng vị trí được chỉ định bởi toán tử thứ hai. Đối với các số dương, các bit mới bên trái được điền với các số 0.

Dưới đây là một ví dụ:

a = 5  # nhị phân: 0101
b = 1
ket_qua = a >> b
print(f"{a} >> {b} = {ket_qua}")  # Kết quả: 5 >> 1 = 2

Ở đây, chúng ta đang dịch các bit của 5 sang phải bởi 1 vị trí. Kết quả là 2 (0010 nhị phân).

Đây là phân tích:

0101 (5)
Dịch phải bởi 1
0010 (2)

Mỗi dịch phải hiệu quả là chia số này cho 2 (chép xuống đến số nguyên gần nhất).

Và thế là xong, các bạn! Chúng ta đã đi qua thế giới của các toán tử bitwise trong Python. Các toán tử này có thể có vẻ một chút trừu tượng ban đầu, nhưng chúng rất mạnh mẽ và hữu ích, đặc biệt khi bạn làm việc với các hoạt động cấp độ thấp hoặc cần tối ưu hóa hiệu suất mã của mình.

Hãy nhớ, luyện tập sẽ khiến bạn hoàn hảo. Hãy thử nghiệm với các toán tử này, thử các số khác nhau và xem kết quả bạn sẽ nhận được. Trước khi bạn biết, bạn sẽ làm việc với các bit như một chuyên gia!

Chúc mãi mãi có mã, và may các bit luôn ở bên cạnh bạn!

Credits: Image by storyset