Τελεστές bitwise της Python (λογικό γινόμενο, λογικό Ή, αποκλειστικό Ή, αντιστροφή, μετατόπιση)

Επιχείρηση

Η Python παρέχει τους ακόλουθους τελεστές bitwise, οι οποίοι εκτελούν λογική σύζευξη, λογική διάζευξη, αποκλειστική διάζευξη, αναστροφή bitwise, μετατόπιση αριστερού bit και μετατόπιση δεξιού bit σε κάθε bit μιας τιμής δυαδικού ακέραιου τύπου int, αντίστοιχα.

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

Σε αυτή την ενότητα, θα εξηγήσουμε πρώτα τα εξής.

  • διασταύρωση (AND) : &
  • διάζευξη (OR) : |
  • Λειτουργία EXCLUSIVE-OR (XOR) : ^

Στη συνέχεια, θα συζητήσουμε τα εξής.

  • Πράξεις bitwise σε αρνητικούς ακέραιους αριθμούς
  • bit flip ( NOT) : ~
  • μετατόπιση bit : << , >>

Για περισσότερες πληροφορίες σχετικά με τον τρόπο γραφής ακεραίων αριθμών σε δυαδικό, οκταδικό και δεκαεξαδικό σύστημα και για τον τρόπο μετατροπής δυαδικών, οκταδικών και δεκαεξαδικών αριθμών και συμβολοσειρών χρησιμοποιώντας τις ακόλουθες συναρτήσεις, ανατρέξτε στο ακόλουθο άρθρο.

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

Επίσης, για λογικές πράξεις (Boolean operations) σε boolean τιμές (true, false) αντί για bitwise πράξεις, ανατρέξτε στο ακόλουθο άρθρο. Χρησιμοποιήστε and,or αντί για &,|.

διασταύρωση (AND) : &χειριστής

Αυτό είναι ένα παράδειγμα λογικού AND με χρήση του τελεστή &, με το αποτέλεσμα να μετατρέπεται σε συμβολοσειρά σε δυαδικό συμβολισμό με τη bin().

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

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

διάζευξη (OR) : |χειριστής

Παράδειγμα λογικού γινομένου (OR) με χρήση του τελεστή |, με το αποτέλεσμα να μετατρέπεται σε συμβολοσειρά σε δυαδικό συμβολισμό από την bin() και να εξάγεται μαζί.

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

Λειτουργία EXCLUSIVE-OR (XOR) : ^χειριστής

Παράδειγμα λογικού γινομένου (XOR) με χρήση του τελεστή ^, σε συνδυασμό με το αποτέλεσμα της μετατροπής σε συμβολοσειρά σε δυαδικό συμβολισμό με χρήση της bin().

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

Η σχέση μεταξύ της εισόδου και της εξόδου για κάθε bit του λογικού AND, OR και XOR παρουσιάζεται στον παρακάτω πίνακα.

Είσοδος 1Είσοδος 2διασταύρωση (AND)διάζευξη (OR)Λειτουργία EXCLUSIVE-OR (XOR)
11110
10011
01011
00000

Πράξεις bitwise σε αρνητικούς ακέραιους αριθμούς

Όταν εκτελείται μια πράξη bitwise σε έναν αρνητικό ακέραιο, η τιμή επεξεργάζεται σαν να ήταν εκφρασμένη σε μορφή συμπληρώματος δύο.

Σημειώστε, ωστόσο, ότι αν μετατρέψετε έναν αρνητικό ακέραιο αριθμό σε δυαδική συμβολοσειρά χρησιμοποιώντας τη bin() ή τη format(), η απόλυτη τιμή θα έχει σύμβολο μείον αντί για μορφή συμπληρώματος δύο.

Αν θέλετε να λάβετε μια συμβολοσειρά με αναπαράσταση συμπληρώματος δύο, κάντε AND με τον μέγιστο αριθμό ψηφίων bit που απαιτούνται, όπως φαίνεται παρακάτω.

  • Για 4-bit0b1111 (=0xf)
  • Για 8-bit0xff
  • Για 16-bit0xffff

Μπορείτε να λάβετε μια συμβολοσειρά αναπαράστασης συμπληρώματος δύο (κάθε bit αντιστρέφεται και προστίθεται 1).

x = -9

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

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

bit flip : ~χειριστής

~παράδειγμα εναλλαγής bit με τελεστές.

Η αντιστροφή κατά ψηφία δεν είναι απλώς η τιμή κάθε bit που αντιστρέφεται. Η τιμή επιστροφής κατά τη χρήση αυτού του τελεστή έχει ως εξής.
~x=-(x+1)

-(x+1)Αυτή η τιμή ισοδυναμεί με το να θεωρηθεί η τιμή εισόδου x σε μορφή συμπληρώματος δύο και να αντιστραφούν όλα τα bits.

Όπως αναφέρθηκε παραπάνω, στην Python, όταν ένας αρνητικός ακέραιος μετατρέπεται σε δυαδική συμβολοσειρά με τη χρήση των bin(), format() κ.λπ., δεν είναι σε μορφή συμπληρώματος δύο, αλλά σε απόλυτη τιμή με πρόσημο μείον. Επομένως, η απευθείας μετατροπή του ~x σε συμβολοσειρά δεν θα έχει ως αποτέλεσμα μια συμβολοσειρά με τα bits της αρχικής τιμής ανεστραμμένα.

x = 9  # 0b1001

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

Όταν εκτελούμε την πράξη AND και τη μετατρέπουμε σε μια συμβολοσειρά αναπαράστασης συμπληρώματος δύο, βλέπουμε ότι τα bits της αρχικής τιμής αντιστρέφονται.

Επιπλέον, για παράδειγμα, για να λάβετε μια συμβολοσειρά bit που είναι μια τετραψήφια συμβολοσειρά bit ανεστραμμένη ως έχει (το πρόσημο παραλείπεται), χρησιμοποιήστε τη λειτουργία format() για να συμπληρώσετε τα μηδενικά για την τιμή με AND ως εξής'04b'

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

μετατόπιση bit : << , >>

Παραδείγματα αριστερής μετατόπισης bit και δεξιάς μετατόπισης bit με χρήση τελεστών μετατόπισης bit.

x = 9  # 0b1001

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

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

Για αρνητικές τιμές, το bit του προσήμου επεκτείνεται και μετατοπίζεται, ενώ το θετικό\αρνητικό πρόσημο παραμένει το ίδιο. Μια αρνητική τιμή είναι η εικόνα μιας γραμμής από 1s σε όλη τη διαδρομή προς τα αριστερά.

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

Είναι προτιμότερο να σκεφτόμαστε με όρους αλυσιδωτών εκφράσεων του συμπληρώματος δύο, αφού η σκέψη με όρους αριθμών δεν είναι σαφής.