Σε αυτό το σεμινάριο, θα μάθετε για διαφορετικές λειτουργίες bitwise στο Swift. Αυτά χρησιμοποιούνται για υπολογισμό επιπέδου bit σε μια έκφραση.
Ένα bit χρησιμοποιείται για να δηλώσει ένα δυαδικό ψηφίο. Ένα δυαδικό ψηφίο μπορεί να έχει δύο πιθανές τιμές είτε 0 είτε 1. Ως προγραμματιστής επιπέδου για αρχάριους, δεν χρειάζεται να εργαστείτε με λειτουργίες στο επίπεδο bit.
Αρκεί η εργασία με πρωτόγονους τύπους δεδομένων όπως: ακέραιος, float, boolean, string κλπ. Ίσως χρειαστεί να εργαστείτε σε επίπεδο bit όταν ασχολείστε με προγραμματισμό χαμηλού επιπέδου.
Το Swift παρέχει ένα πλούσιο σύνολο τελεστών, εκτός από τους βασικούς τελεστές, για χειρισμό bit. Αυτοί οι τελεστές είναι παρόμοιοι με τους λογικούς τελεστές, εκτός από το ότι εργάζονται σε δυαδικές αναπαραστάσεις δεδομένων (bits).
Οι τελεστές Bitwise είναι τελεστές που χρησιμοποιούνται για την αλλαγή μεμονωμένων bit ενός τελεστή. Το Operand είναι μια μεταβλητή ή σταθερά στην οποία γίνεται η λειτουργία.
Όλοι οι διαθέσιμοι τελεστές που είναι διαθέσιμοι γρήγορα αναφέρονται παρακάτω:
1. Bitwise ΟΧΙ χειριστής
Αντιπροσωπεύεται από το ~
σύμβολο tilde και μπορεί να εφαρμοστεί σε έναν μόνο τελεστή. Αυτό αντιστρέφει όλα τα bit. δηλαδή αλλαγές 1 σε 0 και 0 σε 1.
Εάν το x είναι μια μεταβλητή / σταθερά που έχει δυαδική τιμή, δηλαδή 0 ή 1. Η λειτουργία bitwise not στη μεταβλητή x μπορεί να αναπαρασταθεί στον παρακάτω πίνακα:
ΔΕΝΧ | ~ x |
---|---|
0 | 1 |
1 | 0 |
Παράδειγμα 1: Τελεστής bitwise NOT για ακέραιο ακέραιο
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
254
Στο παραπάνω πρόγραμμα, η δήλωση let initalNumber:UInt8 = 1
είναι τύπου Unsigned int μεγέθους 8 bit. Έτσι, το 1 στο δεκαδικό μπορεί να αναπαρασταθεί όπως 00000001
στο δυαδικό.
Ο τελεστής bitwise not αλλάζει όλο το bit μιας μεταβλητής ή σταθεράς, το bit 0 αλλάζει σε 1 και 1 έως 0. Έτσι το invertedNumber περιέχει bits 11111110
. Μετά τη μετατροπή του σε δεκαδικό αντιπροσωπεύεται ως 254. Έτσι, η δήλωση print(invertedNumber)
εξάγει 254 στην οθόνη.
Μπορείτε επίσης να εκτελέσετε τον τελεστή bitwise απευθείας στα bits όπως:
Παράδειγμα 2: Bitwise ΟΧΙ τελεστής σε bits
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
0
ΤοitialBits περιέχει δυαδική τιμή 11111111
που αντιστοιχεί σε 255 σε δεκαδικά. Για να αντιπροσωπεύσουμε τον αριθμό σε δυαδικό έχουμε 0b
ως πρόθεμα στην κυριολεκτική. Χωρίς 0b
πρόθεμα, θα το αντιμετωπίζει ως κανονικό ακέραιο και θα λάβετε ένα σφάλμα υπερχείλισης (το UInt8 μπορεί να αποθηκεύσει αριθμούς μόνο από 0 έως 255).
Εφόσον, έχουμε χρησιμοποιήσει bitwise not operator, αλλάζει όλα τα 1 έως 0. Έτσι, το σταθερό invertedBits περιέχει το 00000000
οποίο είναι ισοδύναμο με 0 in UInt8
.
Παράδειγμα 3: Τελεστής bitwise NOT για υπογεγραμμένο ακέραιο
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
-2
Στο παραπάνω πρόγραμμα, το 1 στο δεκαδικό μπορεί να αναπαρασταθεί όπως 00000001
στο δυαδικό. Ο τελεστής bitwise not αλλάζει όλο το bit μιας μεταβλητής ή σταθεράς, το bit 0 αλλάζει σε 1 και 1 έως 0. Έτσι, το invertedNumber περιέχει bits 11111110
. Αυτό θα πρέπει να εξάγει 254 στην οθόνη. Αντ 'αυτού επιστρέφει -2. Παράξενο, σωστά; Ας δούμε παρακάτω πώς συνέβη αυτό.
let initalNumber:Int = 1
είναι ένα υπογεγραμμένο int που μπορεί να περιέχει τόσο θετικούς όσο και αρνητικούς ακέραιους αριθμούς. Γι 'αυτό όταν δεν εφαρμόσαμε τελεστή για έναν υπογεγραμμένο ακέραιο, το δυαδικό που επιστρέφεται μπορεί επίσης να αντιπροσωπεύει έναν αρνητικό αριθμό.
Πώς ερμήνευσε ο μεταγλωττιστής το -2 ως 11111110
δυαδικό;
Ο μεταγλωττιστής χρησιμοποίησε το συμπλήρωμα Two για να αντιπροσωπεύει ακέραιους αριθμούς. Για να λάβετε την αρνητική σημείωση συμπληρώματος των δύο για έναν ακέραιο, πρέπει πρώτα να γράψετε τον αριθμό σε δυαδικό και στη συνέχεια να αντιστρέψετε τα ψηφία και να προσθέσετε ένα στο αποτέλεσμα.
Βήματα για να μάθετε το συμπλήρωμα του Two του -2 :
- Γράψτε 2 σε δυαδική μορφή:
00000010
- Αντιστρέψτε τα ψηφία. 0 γίνεται 1 και 1 γίνεται 0:
11111101
- Προσθήκη 1:
11111110
Έτσι ο μεταγλωττιστής ερμηνεύει τον δυαδικό αριθμό 1111110
όπως -2
στο δεκαδικό. Όμως, υπάρχει μια μικρή συστροφή που έκανε ο μεταγλωττιστής που δεν παρατηρήσαμε. Επίσης συνήγαγε τον τύπο του ανεστραμμένου αριθμού ως Int8
τύπο.
Για να το καταλάβουμε, ας δούμε ένα παράδειγμα παρακάτω:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
-2 254
Στο παραπάνω παράδειγμα, ο μεταγλωττιστής επεξεργάστηκε τον δυαδικό αριθμό στο -2 με δεκαδικό μόνο για τον ακέραιο αριθμό 8-Bit. Επομένως η δήλωση print(Int8(bitPattern: 0b11111110))
εξάγει -2 στην οθόνη.
Αλλά για τον κανονικό ακέραιο τύπο του οποίου το μέγεθος είναι 32/64 bit και μπορεί να διατηρήσει μεγάλες τιμές, ερμηνεύει την τιμή ως 254
. Επομένως, η δήλωση print(0b11111110)
εξάγει 254 στην οθόνη.
2. Bitwise ΚΑΙ τελεστής
Αντιπροσωπεύεται από &
και μπορεί να εφαρμοστεί σε δύο τελεστές. Ο τελεστής AND συγκρίνει δύο bit και επιστρέφει 1 αν και τα δύο bit είναι 1, διαφορετικά επιστρέφει 0.
Εάν τα x και y είναι μεταβλητά / σταθερά που κατέχουν δυαδική τιμή, δηλαδή 0 ή 1. Η λειτουργία Bitwise AND στα x και y μπορεί να αναπαρασταθεί στον παρακάτω πίνακα:
ΚΑΙΧ | γ | x & ε |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
Παράδειγμα 5: Λειτουργία Bitwise AND
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
Δυαδικό: 10000011 131
Στο παραπάνω πρόγραμμα, η δήλωση let result = xBits & yBits
συνδυάζει τα bit των δύο τελεστών xBits και yBits. Επιστρέφει 1 και τα δύο bit είναι 1 διαφορετικά επιστρέφουν 0.
String(value , radix: )
Το αρχικοποιητή χρησιμοποιείται για την αναπαράσταση του αριθμού σε διαφορετικό σύστημα αριθμών. Εάν παρέχουμε τιμή radix 2. Μετατρέπει τον αριθμό σε δυαδικό σύστημα αριθμών. Παρομοίως, μπορούμε να χρησιμοποιήσουμε 16 για δεκαεξαδικό και 10 για δεκαδικό.
Η δήλωση print("Binary:",String(result, radix: 2))
εξάγει Binary: 10000011 στην οθόνη. 10000011
είναι ισοδύναμο με 131 στα δεκαδικά, η δήλωση print(result)
εξέρχεται 131 στην κονσόλα.
3. Bitwise Ή χειριστής
Αναπαριστάται ως |
και μπορεί να εφαρμοστεί σε δύο τελεστές. Ο χειριστής bitwise OR συγκρίνει δύο bit και δημιουργεί ένα αποτέλεσμα 1 εάν μία ή περισσότερες από τις εισόδους της είναι 1 διαφορετικά 0.
Εάν τα x και y είναι μεταβλητά / σταθερά που κατέχουν δυαδική τιμή, δηλαδή 0 ή 1. Η λειτουργία Bitwise OR στα x και y μπορεί να αναπαρασταθεί στον παρακάτω πίνακα:
ΉΧ | γ | x | γ |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
Παράδειγμα 6: Λειτουργία Bitwise Ή
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
Δυαδικό: 11111111 255
Στο παραπάνω πρόγραμμα, η δήλωση let result = xBits | yBits
συνδυάζει τα bit των δύο σταθερών xBits και yBits. Επιστρέφει 1 εάν οποιοδήποτε από τα bit είναι 1 διαφορετικά επιστρέφει 0.
Η δήλωση print("Binary:",String(result, radix: 2))
εξάγει Binary: 11111111 στην οθόνη. Δεδομένου ότι 11111111
είναι ισοδύναμο με 255
το δεκαδικό, η δήλωση print(result)
εξάγει 255 στην οθόνη.
4. Χειριστής Bitwise XOR
Αναπαριστάται ως ^
και μπορεί να εφαρμοστεί σε δύο τελεστές. Ο χειριστής XOR συγκρίνει δύο δυφία και δημιουργεί ένα αποτέλεσμα 1 εάν ακριβώς μία από τις εισόδους του είναι 1 διαφορετικά επιστρέφει 0.
Εάν τα x και y είναι μεταβλητά / σταθερά που κατέχουν δυαδική τιμή, δηλαδή 0 ή 1. Η λειτουργία Bitwise XOR στα x και y μπορεί να αναπαρασταθεί στον παρακάτω πίνακα:
XORΧ | γ | x ε |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
Παράδειγμα 7: Λειτουργία Bitwise XOR
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result)
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
Δυαδικό: 1111100 124
Στο παραπάνω πρόγραμμα, η δήλωση let result = xBits yBits
συνδυάζει τα bit των δύο σταθερών xBits και yBits. Επιστρέφει 1 εάν ακριβώς ένα από τα bit είναι 1 διαφορετικά επιστρέφει 0.
Η δήλωση print("Binary:",String(result, radix: 2))
εξάγει Binary: 1111100 (ισοδύναμο με 01111100) στην οθόνη. Δεδομένου ότι 1111100
είναι ισοδύναμο με 124
το δεκαδικό, η δήλωση print(result)
εξάγει 124 στην οθόνη.
5. Χειριστής Bitwise Shift
Αυτοί οι τελεστές χρησιμοποιούνται για να μετακινούν όλα τα bit σε έναν αριθμό προς τα αριστερά ή τα δεξιά από έναν ορισμένο αριθμό θέσεων και μπορούν να εφαρμοστούν σε έναν τελεστή. Αντιπροσωπεύεται ως <<
ή >>
.
Υπάρχουν δύο είδη τελεστών αλλαγής ταχυτήτων:
Χειριστής αριστεράς αλλαγής bitwise
- Υποδηλώθηκε ως
<<
- Προκαλεί τα bit να μετατοπιστούν προς τα αριστερά που καθορίζονται από τον αριθμό που ακολουθείται από
<<
. - Οι θέσεις bit που έχουν αδειάσει από τη λειτουργία αλλαγής είναι μηδενικές.
- Η αλλαγή των ψηφίων ενός ακέραιου προς τα αριστερά από μία θέση διπλασιάζει την τιμή της
Παράδειγμα 8: Τελεστής αριστεράς αλλαγής bitwise
let someBits:UInt8 = 0b11000100 print(someBits << 1)
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
136
Στο παραπάνω πρόγραμμα, χρησιμοποιήσαμε τον τελεστή αριστεράς βάρδιας. Χρησιμοποιώντας <<
1 σημαίνει να μετακινήσετε το bit κατά 1 προς τα αριστερά. Τα ψηφία μετατοπίζονται προς τα αριστερά από μία θέση και το τελευταίο ψηφίο στα δεξιά συμπληρώνεται με μηδέν.
Μπορείτε επίσης να δείτε το ψηφίο που μετατοπίζεται "από το τέλος" από την αριστερή πλευρά. Δεν τυλίγεται ξανά από τα δεξιά. Η μετατόπιση ενός bit προς τα αριστερά αφαιρεί το 1 από το δυαδικό και προσθέτει 0 στα δεξιά για να γεμίσει την μετατοπισμένη τιμή καθώς και τα υπόλοιπα bits μετακινούνται προς την αριστερή θέση κατά 1.
Αυτό επιστρέφει το 10001000
οποίο είναι ισοδύναμο με 136
το UInt8
. Επομένως, η print(someBits << 1)
δήλωση εξάγει 136 στην οθόνη.
Τελεστής δεξιάς αλλαγής bitwise
- Υποδηλώθηκε ως
>>
- Προκαλεί τα bit να μετατοπιστούν προς τα δεξιά από τον αριθμό που ακολουθείται από
>>
- Για αριθμούς χωρίς υπογραφή, οι θέσεις bit που έχουν αδειάσει από τη λειτουργία αλλαγής είναι μηδενικές.
- Για τους υπογεγραμμένους αριθμούς (αριθμοί που μπορεί επίσης να είναι αρνητικοί), το σύμβολο bit χρησιμοποιείται για να γεμίσει τις κενές θέσεις bit. Με άλλα λόγια, εάν ο αριθμός είναι θετικός, χρησιμοποιείται το 0 και αν ο αριθμός είναι αρνητικός, χρησιμοποιείται 1.
- Η μετατόπιση προς τα δεξιά από μία θέση μειώνει στο μισό την αξία της.
Παράδειγμα 9: Τελεστής δεξιάς αλλαγής bitwise για ακέραιο ακέραιο
let someBits: UInt8 = 4 print(someBits>> 1)
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
2
Στο παραπάνω πρόγραμμα, έχουμε χρησιμοποιήσει τον τελεστή δεξιάς μετατόπισης σε έναν μη υπογεγραμμένο ακέραιο. Χρησιμοποιώντας >>
1 σημαίνει να μετακινήσετε το bit κατά 1 προς τα δεξιά. Οι θέσεις bit που έχουν αδειάσει από τη λειτουργία shift είναι πάντα μηδενικές σε έναν ακέραιο ακέραιο.
Από τότε, το 4 αντιπροσωπεύεται ως 00000100
δυαδικό. Μετατόπιση είναι ένα bit προς τα δεξιά, επιστρέφει 00000010
το οποίο είναι ισοδύναμο με 2
το UInt8
. Επομένως, η print(someBits>> 1)
δήλωση εξάγει 2 στην οθόνη.
Παράδειγμα 10: Τελεστής δεξιάς αλλαγής Bitwise για υπογεγραμμένο ακέραιο
let someBits:Int = -4 print(someBits>> 1)
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
-2
Στο παραπάνω πρόγραμμα, έχουμε χρησιμοποιήσει τον τελεστή δεξιάς μετατόπισης σε έναν μη υπογεγραμμένο ακέραιο. Σε αντίθεση με τους θετικούς αριθμούς, χρησιμοποιείται >>
για αρνητικούς αριθμούς, το 1 χρησιμοποιείται για να γεμίσει το κενό μέρος, αντί για 0.
Από τότε, -4
παρουσιάζεται ως 11111100
δυαδικό. Μετατόπιση αυτό ένα bit προς τα δεξιά και τοποθετώντας 1 στην κενή θέση, επιστρέφει 11111110
το οποίο είναι ισοδύναμο με -2
για Int8
τον τύπο. Επομένως, η print(someBits>> 1)
δήλωση εξάγει -2 στην οθόνη.