Python cung cấp các toán tử theo chiều bit sau, thực hiện phép kết hợp lôgic, phép tách lôgic, phép tách riêng, đảo ngược bit, dịch chuyển bit trái và dịch chuyển bit phải trên mỗi bit của giá trị int kiểu số nguyên nhị phân, tương ứng.
&
|
^
~
<<
>>
Trong phần này, trước tiên chúng tôi giải thích những điều sau đây.
- ngã tư(AND) :
&
- phân ly(OR) :
|
- Hoạt động ĐỘC QUYỀN-HOẶC(XOR) :
^
Tiếp theo, chúng ta sẽ thảo luận về những điều sau đây.
- Các phép toán bit trên số nguyên âm
- lật một chút( NOT) :
~
- sự thay đổi bit:
<<
,>>
Để biết thêm thông tin về cách viết số nguyên ở dạng nhị phân, bát phân và thập lục phân cũng như cách chuyển đổi số và chuỗi nhị phân, bát phân và thập lục phân bằng cách sử dụng các hàm sau, hãy xem bài viết sau.
bin()
oct()
hex()
format()
- Những bài viết liên quan:Chuyển đổi các số và chuỗi nhị phân, bát phân và thập lục phân sang và từ nhau trong Python
Ngoài ra, đối với các phép toán logic (phép toán Boolean) trên các giá trị boolean (true, false) thay vì các phép toán bit, hãy tham khảo bài viết sau. Sử dụng và hoặc thay cho & amp;, |.
- Những bài viết liên quan:Toán tử lôgic của Python và hoặc và không (kết hợp lôgic, phân tách, phủ định)
ngã tư(AND) :&nhà điều hành
Đây là một ví dụ về AND hợp lý bằng cách sử dụng & amp; toán tử, với kết quả được chuyển đổi thành một chuỗi trong ký hiệu nhị phân bởi bin ().
x = 9 # 0b1001 y = 10 # 0b1010 print(x & y) print(bin(x & y)) # 8 # 0b1000
phân ly(OR) :|nhà điều hành
Một ví dụ về tích hợp lý (OR) sử dụng dấu | toán tử, với kết quả được chuyển đổi thành một chuỗi trong ký hiệu nhị phân bởi bin () và xuất cùng nhau.
print(x | y) print(bin(x | y)) # 11 # 0b1011
Hoạt động ĐỘC QUYỀN-HOẶC(XOR) :^nhà điều hành
Ví dụ về tích logic (XOR) sử dụng toán tử ^, được kết hợp với kết quả chuyển đổi thành chuỗi trong ký hiệu nhị phân bằng cách sử dụng bin ().
print(x ^ y) print(bin(x ^ y)) # 3 # 0b11
Mối quan hệ giữa đầu vào và đầu ra cho mỗi bit logic AND, OR và XOR được hiển thị trong bảng dưới đây.
Đầu vào 1 | Đầu vào 2 | ngã tư(AND) | phân ly(OR) | Hoạt động ĐỘC QUYỀN-HOẶC(XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
Các phép toán bit trên số nguyên âm
Khi một phép toán bitwise được thực hiện trên một số nguyên âm, giá trị được xử lý như thể nó được biểu thị ở dạng phần bù của hai.
Tuy nhiên, lưu ý rằng nếu bạn chuyển đổi một số nguyên âm thành một chuỗi nhị phân bằng cách sử dụng bin () hoặc format (), giá trị tuyệt đối sẽ có dấu trừ thay vì định dạng bổ sung của hai dấu.
Nếu bạn muốn lấy một chuỗi có biểu diễn phần bù của hai, hãy lấy AND với số bit tối đa được yêu cầu, như được hiển thị bên dưới.
- Đối với 4-bit
0b1111
(=0xf
) - Đối với 8-bit
0xff
- Đối với 16-bit
0xffff
Bạn có thể nhận được một chuỗi biểu diễn phần bù của hai (mỗi bit được đảo ngược và 1 được thêm vào).
x = -9 print(x) print(bin(x)) # -9 # -0b1001 print(bin(x & 0xff)) print(format(x & 0xffff, 'x')) # 0b11110111 # fff7
- Những bài viết liên quan:Chuyển đổi các số và chuỗi nhị phân, bát phân và thập lục phân sang và từ nhau trong Python
lật một chút:~nhà điều hành
~ ví dụ về phép lật bit với các toán tử.
Đảo ngược bit không chỉ đơn giản là giá trị của mỗi bit được đảo ngược. Giá trị trả về khi sử dụng toán tử này như sau.~x
#ERROR!-(x+1)
-(x+1)
Giá trị này tương đương với việc coi giá trị đầu vào x là dạng phần bù của hai và đảo ngược tất cả các bit.
Như đã đề cập ở trên, trong Python, khi một số nguyên âm được chuyển đổi thành một chuỗi nhị phân bằng cách sử dụng bin (), format (), v.v., nó không ở dạng phần bù của hai mà ở dạng giá trị tuyệt đối với một dấu trừ. Do đó, việc chuyển đổi ~ x trực tiếp thành một chuỗi sẽ không dẫn đến một chuỗi có các bit của giá trị ban đầu bị đảo ngược.
x = 9 # 0b1001 print(~x) print(bin(~x)) # -10 # -0b1010
Khi chúng ta thực hiện phép toán AND và biến nó thành một chuỗi biểu diễn phần bù của hai, chúng ta có thể thấy rằng các bit của giá trị ban đầu được đảo ngược.
Ngoài ra, ví dụ: để lấy một chuỗi bit là một chuỗi bit 4 chữ số được đảo ngược nguyên trạng (bỏ qua bit dấu), hãy sử dụng format () để điền vào các số không cho giá trị ANDed như sau04b'
print(bin(~x & 0xff)) print(format(~x & 0b1111, '04b')) # 0b11110110 # 0110
sự thay đổi bit:<<,>>
Ví dụ về dịch chuyển bit trái và dịch chuyển bit phải sử dụng toán tử dịch chuyển bit.
x = 9 # 0b1001 print(x << 1) print(bin(x << 1)) # 18 # 0b10010 print(x >> 1) print(bin(x >> 1)) # 4 # 0b100
Đối với các giá trị âm, bit dấu được mở rộng và dịch chuyển, còn dấu dương / âm vẫn giữ nguyên. Giá trị âm là hình ảnh của một dòng 1s nằm ở phía bên trái.
x = -9 print(bin(x)) print(bin(x & 0xff)) # -0b1001 # 0b11110111 print(x << 1) print(bin(x << 1)) print(bin((x << 1) & 0xff)) # -18 # -0b10010 # 0b11101110 print(x >> 1) print(bin(x >> 1)) print(bin((x >> 1) & 0xff)) # -5 # -0b101 # 0b11111011
Tốt hơn là suy nghĩ theo chuỗi của biểu thức bù của hai, vì suy nghĩ về số không rõ ràng.