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()
- Artikel berkaitan:Tukar nombor dan rentetan perduaan, perlapanan dan perenambelasan kepada dan daripada satu sama lain dalam Python
Juga, untuk operasi logik (operasi Boolean) pada nilai boolean (benar, palsu) dan bukannya operasi bitwise, rujuk artikel berikut. Gunakan dan, atau bukannya &,|.
- Artikel berkaitan:Pengendali logik Python dan, atau, dan bukan (konjungsi logik, disjungsi, penolakan)
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 1 | Input 2 | persimpangan(AND) | perpecahan(OR) | EKSKLUSIF-ATAU operasi(XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
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-bit
0b1111
(=0xf
) - Untuk 8-bit
0xff
- Untuk 16-bit
0xffff
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
- Artikel berkaitan:Tukar nombor dan rentetan perduaan, perlapanan dan perenambelasan kepada dan daripada satu sama lain dalam Python
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.