Pengendali bitwise Python (produk logik, logik ATAU, eksklusif ATAU, penyongsangan, anjakan)

Perniagaan

Python menyediakan operator bitwise berikut, yang melakukan konjungsi logik, percabaran logik, percabaran eksklusif, penyongsangan bitwise, anjakan bit kiri dan anjakan bit kanan pada setiap bit nilai int jenis integer binari.

  • &
  • |
  • ^
  • ~
  • <<
  • >>

Dalam bahagian ini, kami mula-mula menerangkan perkara berikut.

  • persimpangan(AND) :&
  • perpecahan(OR) :|
  • EKSKLUSIF-ATAU operasi(XOR) :^

Seterusnya, kita akan membincangkan perkara berikut.

  • Operasi bitwise pada integer negatif
  • terbalik sikit( NOT) :~
  • peralihan sedikit:<<,>>

Untuk mendapatkan maklumat lanjut tentang cara menulis integer dalam perduaan, perlapanan dan perenambelasan, dan cara menukar nombor dan rentetan perduaan, perlapanan dan perenambelasan menggunakan fungsi berikut, lihat artikel berikut.

  • bin()
  • oct()
  • hex()
  • format()

Juga, untuk operasi logik (operasi Boolean) pada nilai boolean (benar, palsu) dan bukannya operasi bitwise, rujuk artikel berikut. Gunakan dan, atau bukannya &,|.

persimpangan(AND) :&pengendali

Ini adalah contoh logik DAN menggunakan & operator, dengan hasilnya ditukar kepada rentetan dalam tatatanda binari oleh bin().

x = 9   # 0b1001
y = 10  # 0b1010

print(x & y)
print(bin(x & y))
# 8
# 0b1000

perpecahan(OR) :|pengendali

Contoh produk logik (ATAU) menggunakan | operator, dengan hasilnya ditukar kepada rentetan dalam tatatanda binari oleh bin() dan output bersama-sama.

print(x | y)
print(bin(x | y))
# 11
# 0b1011

EKSKLUSIF-ATAU operasi(XOR) :^pengendali

Contoh produk logik (XOR) menggunakan operator ^, digabungkan dengan hasil penukaran kepada rentetan dalam tatatanda binari menggunakan bin().

print(x ^ y)
print(bin(x ^ y))
# 3
# 0b11

Hubungan antara input dan output bagi setiap bit logik AND, OR, dan XOR ditunjukkan dalam jadual di bawah.

Input 1Input 2persimpangan(AND)perpecahan(OR)EKSKLUSIF-ATAU operasi(XOR)
11110
10011
01011
00000

Operasi bitwise pada integer negatif

Apabila operasi bitwise dilakukan pada integer negatif, nilai diproses seolah-olah ia dinyatakan dalam bentuk pelengkap dua.

Walau bagaimanapun, ambil perhatian bahawa jika anda menukar integer negatif kepada rentetan binari menggunakan bin() atau format(), nilai mutlak akan mempunyai tanda tolak dan bukannya format pelengkap dua.

Jika anda ingin mendapatkan rentetan dengan perwakilan pelengkap dua, ambil DAN dengan bilangan maksimum digit bit yang diperlukan, seperti yang ditunjukkan di bawah.

  • Untuk 4-bit0b1111(=0xf)
  • Untuk 8-bit0xff
  • Untuk 16-bit0xffff

Anda boleh mendapatkan rentetan perwakilan pelengkap dua (setiap bit diterbalikkan dan 1 ditambah).

x = -9

print(x)
print(bin(x))
# -9
# -0b1001

print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

terbalik sikit:~pengendali

~contoh bit flipping dengan operator.

Penyongsangan bit bukan sekadar nilai bagi setiap bit terbalik. Nilai pulangan apabila menggunakan operator ini adalah seperti berikut.
~x#ERROR!-(x+1)

-(x+1)Nilai ini bersamaan dengan mempertimbangkan nilai input x sebagai bentuk pelengkap dua dan menyongsangkan semua bit.

Seperti yang dinyatakan di atas, dalam Python, apabila integer negatif ditukar kepada rentetan binari menggunakan bin(), format(), dsb., ia bukan dalam bentuk pelengkap dua, tetapi dalam nilai mutlak dengan tanda tolak. Oleh itu, menukar ~x terus kepada rentetan tidak akan menghasilkan rentetan dengan bit nilai asal terbalik.

x = 9  # 0b1001

print(~x)
print(bin(~x))
# -10
# -0b1010

Apabila kita melaksanakan operasi DAN dan mengubahnya menjadi rentetan perwakilan pelengkap dua, kita dapat melihat bahawa bit nilai asal adalah terbalik.

Sebagai tambahan, sebagai contoh, untuk mendapatkan rentetan bit yang merupakan rentetan bit 4 digit terbalik seperti sedia ada (bit tanda diabaikan), gunakan format() untuk mengisi sifar untuk nilai ANDed seperti berikut04b'

print(bin(~x & 0xff))
print(format(~x & 0b1111, '04b'))
# 0b11110110
# 0110

peralihan sedikit:<<,>>

Contoh anjakan bit kiri dan anjakan bit kanan menggunakan operator anjakan bit.

x = 9  # 0b1001

print(x << 1)
print(bin(x << 1))
# 18
# 0b10010

print(x >> 1)
print(bin(x >> 1))
# 4
# 0b100

Untuk nilai negatif, bit tanda dilanjutkan dan dialihkan, dan tanda positif/negatif kekal sama. Nilai negatif ialah imej bagi garisan 1s hingga ke kiri.

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

Adalah lebih baik untuk berfikir dari segi rentetan ungkapan pelengkap dua, kerana pemikiran dari segi nombor tidak jelas.