Toán tử bitwise trong Python (sản phẩm logic, OR logic, OR độc quyền, đảo ngược, shift)

Kinh doanh

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()

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;, |.

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 2ngã tư(AND)phân ly(OR)Hoạt động ĐỘC QUYỀN-HOẶC(XOR)
11110
10011
01011
00000

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-bit0b1111(=0xf)
  • Đối với 8-bit0xff
  • Đối với 16-bit0xffff

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

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.

Copied title and URL