Η Python παρέχει τους ακόλουθους τελεστές bitwise, οι οποίοι εκτελούν λογική σύζευξη, λογική διάζευξη, αποκλειστική διάζευξη, αναστροφή bitwise, μετατόπιση αριστερού bit και μετατόπιση δεξιού bit σε κάθε bit μιας τιμής δυαδικού ακέραιου τύπου int, αντίστοιχα.
&|^~<<>>
Σε αυτή την ενότητα, θα εξηγήσουμε πρώτα τα εξής.
- διασταύρωση (AND) :
& - διάζευξη (OR) :
| - Λειτουργία EXCLUSIVE-OR (XOR) :
^
Στη συνέχεια, θα συζητήσουμε τα εξής.
- Πράξεις bitwise σε αρνητικούς ακέραιους αριθμούς
- bit flip ( NOT) :
~ - μετατόπιση bit :
<<,>>
Για περισσότερες πληροφορίες σχετικά με τον τρόπο γραφής ακεραίων αριθμών σε δυαδικό, οκταδικό και δεκαεξαδικό σύστημα και για τον τρόπο μετατροπής δυαδικών, οκταδικών και δεκαεξαδικών αριθμών και συμβολοσειρών χρησιμοποιώντας τις ακόλουθες συναρτήσεις, ανατρέξτε στο ακόλουθο άρθρο.
bin()oct()hex()format()
- Σχετικά άρθρα:Μετατροπή δυαδικών, οκταδικών και δεκαεξαδικών αριθμών και συμβολοσειρών μεταξύ τους στην Python
Επίσης, για λογικές πράξεις (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) |
|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 0 | 0 | 0 | 0 | 0 |
Πράξεις bitwise σε αρνητικούς ακέραιους αριθμούς
Όταν εκτελείται μια πράξη bitwise σε έναν αρνητικό ακέραιο, η τιμή επεξεργάζεται σαν να ήταν εκφρασμένη σε μορφή συμπληρώματος δύο.
Σημειώστε, ωστόσο, ότι αν μετατρέψετε έναν αρνητικό ακέραιο αριθμό σε δυαδική συμβολοσειρά χρησιμοποιώντας τη bin() ή τη format(), η απόλυτη τιμή θα έχει σύμβολο μείον αντί για μορφή συμπληρώματος δύο.
Αν θέλετε να λάβετε μια συμβολοσειρά με αναπαράσταση συμπληρώματος δύο, κάντε AND με τον μέγιστο αριθμό ψηφίων bit που απαιτούνται, όπως φαίνεται παρακάτω.
- Για 4-bit
0b1111(=0xf) - Για 8-bit
0xff - Για 16-bit
0xffff
Μπορείτε να λάβετε μια συμβολοσειρά αναπαράστασης συμπληρώματος δύο (κάθε bit αντιστρέφεται και προστίθεται 1).
x = -9 print(x) print(bin(x)) # -9 # -0b1001 print(bin(x & 0xff)) print(format(x & 0xffff, 'x')) # 0b11110111 # fff7
- Σχετικά άρθρα:Μετατροπή δυαδικών, οκταδικών και δεκαεξαδικών αριθμών και συμβολοσειρών μεταξύ τους στην Python
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
Είναι προτιμότερο να σκεφτόμαστε με όρους αλυσιδωτών εκφράσεων του συμπληρώματος δύο, αφού η σκέψη με όρους αριθμών δεν είναι σαφής.