In deze zelfstudie leert u over verschillende bitsgewijze bewerkingen in Swift. Deze worden gebruikt voor berekening op bitniveau in een uitdrukking.
Een bit wordt gebruikt om een binair cijfer aan te duiden. Een binair cijfer kan twee mogelijke waarden hebben: 0 of 1. Als programmeur op beginnersniveau hoeft u niet te werken met bewerkingen op bitniveau.
Werken met primitieve gegevenstypen zoals: integer, float, boolean, string enz. Is voldoende. Mogelijk moet u op bitniveau werken als u te maken heeft met programmering op laag niveau.
Swift biedt een uitgebreide reeks operators, afgezien van basisoperatoren, om bits te manipuleren. Deze operatoren lijken op de logische operatoren, behalve dat ze werken op binaire representaties van gegevens (bits).
Bitwise-operators zijn operators die worden gebruikt om individuele bits van een operand te wijzigen. Operand is een variabele of constante waarin de bewerking wordt uitgevoerd.
Alle bitwise-operators die in Swift beschikbaar zijn, worden hieronder vermeld:
1. Bitsgewijs NIET operator
Het wordt weergegeven door een tilde- ~
teken en kan op een enkele operand worden toegepast. Dit keert alle bits om. dwz verandert 1 in 0 en 0 in 1.
Als x een variabele / constante is die een binaire waarde bevat, dwz 0 of 1. De bitsgewijze niet-bewerking op de x-variabele kan in onderstaande tabel worden weergegeven:
NIETX | ~ x |
---|---|
0 | 1 |
1 | 0 |
Voorbeeld 1: bitsgewijze NOT-operator voor geheel getal zonder teken
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
254
In het bovenstaande programma is de instructie let initalNumber:UInt8 = 1
van het type Unsigned int met een grootte van 8 bits. Dus 1 in decimaal kan worden weergegeven als 00000001
in binair.
De bitsgewijze niet-operator verandert de hele bit van een variabele of constante, de bit 0 wordt gewijzigd in 1 en 1 in 0. Dus invertedNumber bevat bits 11111110
. Na het omzetten in decimalen wordt het weergegeven als 254. De instructie print(invertedNumber)
geeft dus 254 op het scherm weer.
U kunt de bitsgewijze operator ook rechtstreeks in de bits uitvoeren als:
Voorbeeld 2: Bitwise NOT-operator in bits
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
0
initialBits bevat een binaire waarde 11111111
die overeenkomt met 255 in decimalen. Om het getal in binair weer te geven, hebben we 0b
een voorvoegsel in de letterlijke. Zonder 0b
als voorvoegsel wordt het als een normaal geheel getal behandeld en krijgt u een overloopfout (UInt8 kan alleen getallen van 0 tot 255 opslaan).
Omdat we de bitsgewijze niet-operator hebben gebruikt, verandert het alle 1 in 0. Dus de constante invertedBits bevat 00000000
wat gelijk is aan 0 in UInt8
.
Voorbeeld 3: bitsgewijze NOT-operator voor geheel getal met teken
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
-2
In het bovenstaande programma kan 1 in decimaal worden weergegeven als 00000001
in binair. De bitsgewijze not-operator verandert de hele bit van een variabele of constante, de bit 0 wordt gewijzigd in 1 en 1 in 0. Dus, invertedNumber bevat bits 11111110
. Dit zou 254 op het scherm moeten weergeven. Maar retourneert in plaats daarvan -2. Vreemd toch ?? Laten we hieronder onderzoeken hoe dit is gebeurd.
let initalNumber:Int = 1
is een ondertekende int die zowel positieve als negatieve gehele getallen kan bevatten. Dat is de reden waarom wanneer we de operator niet hebben toegepast voor een geheel getal met teken, het geretourneerde binaire bestand ook een negatief getal kan vertegenwoordigen.
Hoe interpreteerde de compiler -2 als 11111110
in binair?
De compiler gebruikte Two's complement om gehele getallen weer te geven. Om de negatieve notatie van het twee-complement van een geheel getal te krijgen, moet u eerst het getal in binair getal opschrijven, vervolgens de cijfers omkeren en een aan het resultaat toevoegen.
Stappen om Two's complement van -2 te ontdekken :
- Schrijf 2 in binaire vorm:
00000010
- Keer de cijfers om. 0 wordt 1 en 1 wordt 0:
11111101
- Voeg 1 toe:
11111110
Dat is hoe de compiler het binaire getal interpreteert 1111110
als een -2
decimaal getal . Maar er is een kleine draai die de compiler heeft gemaakt die we niet hebben opgemerkt. Het leidde ook het type van invertedNumber af als Int8
type.
Laten we hieronder een voorbeeld bekijken om dit te begrijpen:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
-2 254
In het bovenstaande voorbeeld behandelde de compiler het binaire getal naar -2 in decimaal, alleen voor het ondertekende 8-bits geheel getal. Daarom print(Int8(bitPattern: 0b11111110))
voert de instructie -2 uit op het scherm.
Maar voor het normale integer-type waarvan de grootte 32/64 bit is en grote waarden kan bevatten, wordt de waarde geïnterpreteerd als 254
. Daarom print(0b11111110)
voert instructie 254 uit op het scherm.
2. Bitwise EN Operator
Het wordt weergegeven door &
en kan worden toegepast op twee operanden. De AND-operator vergelijkt twee bits en retourneert 1 als beide bits 1 zijn, anders 0.
Als x en y variabel / constant zijn, bevat dit een binaire waarde, dwz 0 of 1. De bitsgewijze EN-bewerking op x en y kan in de onderstaande tabel worden weergegeven:
ENX | y | x & y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
Voorbeeld 5: bitsgewijze EN-bewerking
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
Binair: 10000011131
In het bovenstaande programma let result = xBits & yBits
combineert de instructie de bits van twee operanden xBits en yBits. Het geeft 1 terug, beide bits zijn 1, anders wordt 0 geretourneerd.
String(value , radix: )
initializer wordt gebruikt om nummer in een ander nummerstelsel weer te geven. Als we radixwaarde 2 opgeven. Het converteert het getal naar een binair getalsysteem. Evenzo kunnen we 16 gebruiken voor hexadecimaal en 10 voor decimalen.
De instructie print("Binary:",String(result, radix: 2))
geeft Binary: 10000011 op het scherm weer. 10000011
is gelijk aan 131 in decimaal, de instructie print(result)
voert 131 uit in de console.
3. Bitsgewijs OF Operator
Het wordt weergegeven als |
en kan worden toegepast op twee operanden. De bitsgewijze OR-operator vergelijkt twee bits en genereert een resultaat van 1 als een of meer van de ingangen 1 zijn, anders 0.
Als x en y variabel / constant zijn, bevat dit een binaire waarde, dwz 0 of 1. De bitsgewijze OR-bewerking op x en y kan in onderstaande tabel worden weergegeven:
OFX | y | x | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
Voorbeeld 6: bitsgewijze OF-bewerking
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
Binair: 11111111255
In het bovenstaande programma let result = xBits | yBits
combineert de instructie de bits van twee constanten xBits en yBits. Het geeft 1 terug als een van de bits 1 is, anders geeft het 0 terug.
De instructie print("Binary:",String(result, radix: 2))
geeft Binair: 11111111 op het scherm weer. Aangezien, 11111111
gelijk is aan 255
in decimaal, print(result)
voert de instructie 255 uit op het scherm.
4. Bitsgewijze XOR-operator
Het wordt weergegeven als ^
en kan worden toegepast op twee operanden. De XOR-operator vergelijkt twee bits en genereert een resultaat van 1 als precies een van de ingangen 1 is, anders retourneert het 0.
Als x en y variabel / constant zijn, bevat dit een binaire waarde, dwz 0 of 1. De Bitwise XOR-bewerking op x en y kan in de onderstaande tabel worden weergegeven:
XORX | y | x y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
Voorbeeld 7: Bitwise XOR-bewerking
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result)
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
Binair: 1111100124
In het bovenstaande programma let result = xBits yBits
combineert de instructie de bits van twee constanten xBits en yBits. Het geeft 1 terug als precies een van de bits 1 is, anders geeft het 0 terug.
De instructie print("Binary:",String(result, radix: 2))
geeft Binair: 1111100 (equivalent aan 01111100) op het scherm weer. Aangezien, 1111100
gelijk is aan 124
in decimaal, print(result)
voert de instructie 124 uit op het scherm.
5. Bitwise Shift-operator
Deze operatoren worden gebruikt om alle bits in een getal een bepaald aantal plaatsen naar links of rechts te verplaatsen en kunnen op een enkele operand worden toegepast. Het wordt weergegeven als <<
of >>
.
Er zijn twee soorten ploegendienstmedewerkers:
Bitsgewijze linker shift-operator
- Aangeduid als
<<
- Het zorgt ervoor dat de bits naar links worden verschoven, gespecificeerd door het nummer gevolgd door
<<
. - De bitposities die zijn vrijgemaakt door de shift-operatie, worden met nul gevuld.
- Het verschuiven van de bits van een geheel naar links met één positie verdubbelt de waarde
Voorbeeld 8: Bitwise left shift-operator
let someBits:UInt8 = 0b11000100 print(someBits << 1)
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
136
In het bovenstaande programma hebben we de linker shift-operator gebruikt. Gebruik <<
1 middelen voor het bit verschuiven 1 naar links. De cijfers worden één positie naar links verschoven en het laatste cijfer aan de rechterkant wordt gevuld met een nul.
U kunt ook zien dat het cijfer dat "van het einde" van de linkerkant wordt verschoven, verloren is gegaan. Het wikkelt zich niet weer van rechts om. Als u het een bit naar links verschuift, wordt de 1 uit het binaire bestand verwijderd en wordt 0 aan de rechterkant toegevoegd om de verschoven waarde te vullen en de rest van de andere bits wordt met 1 naar de linkerpositie verschoven.
Dit retourneert 10001000
wat gelijk is aan 136
in UInt8
. Daarom print(someBits << 1)
voert instructie 136 uit op het scherm.
Bitsgewijze rechter shift-operator
- Aangeduid als
>>
- Het zorgt ervoor dat de bits naar rechts worden verschoven met het nummer gevolgd door
>>
- Voor niet-ondertekende nummers worden de bitposities die zijn vrijgemaakt door de shift-operatie nul gevuld.
- Voor getallen met teken (getallen die ook negatief kunnen zijn) wordt de tekenbit gebruikt om de vrijgekomen bitposities te vullen. Met andere woorden, als het getal positief is, wordt 0 gebruikt en als het getal negatief is, wordt 1 gebruikt.
- Door het één positie naar rechts te verschuiven, wordt de waarde gehalveerd.
Voorbeeld 9: Bitwise-operator voor verschuiven naar rechts voor een geheel getal zonder teken
let someBits: UInt8 = 4 print(someBits>> 1)
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
2
In het bovenstaande programma hebben we de rechterverschuivingsoperator gebruikt op een geheel getal zonder teken. Het gebruik van >>
1 betekent het bit 1 naar rechts verschuiven. De bitposities die zijn vrijgemaakt door de shift-operatie, worden altijd met nul gevuld op een geheel getal zonder teken.
Omdat 4 wordt weergegeven als 00000100
in binair. Als u het een beetje naar rechts verschuift, wordt geretourneerd 00000010
wat gelijk is aan 2
in UInt8
. Daarom geeft print(someBits>> 1)
instructie 2 op het scherm weer.
Voorbeeld 10: Bitwise-operator voor verschuiven naar rechts voor een geheel getal met teken
let someBits:Int = -4 print(someBits>> 1)
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
-2
In het bovenstaande programma hebben we de rechterverschuivingsoperator gebruikt op een geheel getal zonder teken. In tegenstelling tot positieve getallen, wordt >>
voor negatieve getallen 1 gebruikt om de lege plaats te vullen, in plaats van 0.
Omdat, -4
wordt weergegeven als 11111100
in binair. Een bit naar rechts verschuiven en 1 in een lege positie plaatsen, geeft als resultaat 11111110
wat gelijk is aan -2
voor Int8
type. Daarom print(someBits>> 1)
voert de instructie -2 uit op het scherm.