V tomto výučbe sa dozviete o rôznych bitových operáciách v aplikácii Swift. Používajú sa na výpočet bitovej úrovne vo výraze.
Bitom sa označuje binárna číslica. Binárna číslica môže mať dve možné hodnoty buď 0 alebo 1. Ako programátor na úrovni začiatočníkov nemusíte pracovať s operáciami na bitovej úrovni.
Stačí pracovať s primitívnymi dátovými typmi, ako sú: integer, float, boolean, string atď. Možno budete musieť pracovať na bitovej úrovni, keď pracujete s programovaním na nízkej úrovni.
Swift poskytuje okrem základných operátorov bohatú skupinu operátorov na manipuláciu s bitmi. Tieto operátory sú podobné logickým operátorom, až na to, že pracujú na binárnych znázorneniach údajov (bitov).
Bitové operátory sú operátory, ktoré sa používajú na zmenu jednotlivých bitov operandu. Operand je premenná alebo konštanta, v ktorej sa operácia vykonáva.
Nižšie sú uvedené všetky bitové operátory dostupné v aplikácii Swift:
1. Bitový operátor NIE
Predstavuje to ~
znak vlnovky a možno ho použiť na jeden operand. To invertuje všetky bity. tj zmeny 1 na 0 a 0 na 1.
Ak je x premenná / konštanta, ktorá obsahuje binárnu hodnotu, tj 0 alebo 1. Bitovú neoperáciu s premennou x môžeme znázorniť v nasledujúcej tabuľke:
NIEX | ~ x |
---|---|
0 | 1 |
1 | 0 |
Príklad 1: Bitový operátor NOT pre celé číslo bez znamienka
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Keď spustíte vyššie uvedený program, výstup bude:
254
Vo vyššie uvedenom programe je príkaz let initalNumber:UInt8 = 1
typu Unsigned int o veľkosti 8 bitov. Takže 1 v desatinnej čiarke môže byť vyjadrené ako 00000001
v binárnom formáte.
Operátor bitový not not zmení všetok bit premennej alebo konštanty, bit 0 sa zmení na 1 a 1 na 0. Takže invertedNumber obsahuje bity 11111110
. Po prepočte na desatinné miesto je to vyjadrené ako 254. Takže z výpisu bude print(invertedNumber)
výstup 254 na obrazovke.
Bitový operátor môžete vykonať aj priamo v bitoch ako:
Príklad 2: Bitový operátor NOT v bitoch
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
Keď spustíte vyššie uvedený program, výstup bude:
0
initialBits obsahuje binárnu hodnotu, 11111111
ktorá zodpovedá 255 v desatinnom čísle . Aby sme reprezentovali číslo v binárnej podobe, máme 0b
ako predponu v doslovnom znení. Bez 0b
predpony to bude považovať za normálne celé číslo a dostanete chybu pretečenia (UInt8 dokáže ukladať čísla iba od 0 do 255).
Pretože sme použili bitový operátor not, zmení sa celá 1 na 0. Takže konštanta invertedBits obsahuje, 00000000
čo je ekvivalentné 0 v UInt8
.
Príklad 3: Bitový operátor NOT pre celé číslo so znamienkom
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Keď spustíte vyššie uvedený program, výstup bude:
-2
Vo vyššie uvedenom programe môže byť 1 v desatinnej čiarke vyjadrená ako 00000001
v binárnom formáte. Operátor bitový not not zmení všetok bit premennej alebo konštanty, bit 0 sa zmení na 1 a 1 na 0. Takže invertedNumber obsahuje bity 11111110
. To by malo na obrazovke vyprodukovať 254. Ale namiesto toho vráti -2. Zvláštne, však? Poďme preskúmať nižšie, ako sa to stalo.
let initalNumber:Int = 1
je podpísané int, ktoré môže obsahovať celé aj kladné aj záporné celé číslo. To je dôvod, prečo keď sme pre celé číslo so znamienkom použili operátor not, vrátená binárka môže tiež predstavovať záporné číslo.
Ako prekladač interpretoval -2 ako 11111110
v binárnom formáte?
Kompilátor použil dvojitý doplnok na vyjadrenie celých čísel. Ak chcete získať zápornú notáciu celého čísla doplnkom dvoch, mali by ste najskôr napísať číslo v binárnom formáte, potom invertovať číslice a pridať jednu k výsledku.
Kroky na zistenie dvojky doplnku -2 :
- Napíšte 2 v binárnej forme:
00000010
- Obráťte číslice. 0 sa stáva 1 a 1 sa stáva 0:
11111101
- Pridať 1:
11111110
Takto prekladač interpretuje binárne číslo 1111110
ako -2
v desatinnej sústave. Ale kompilátor urobil trochu zvrat, čo sme si nevšimli. Tiež odvodil typ invertedNumber ako Int8
typ.
Aby sme tomu porozumeli, pozrime sa na príklad nižšie:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
Keď spustíte vyššie uvedený program, výstup bude:
-2 254
Vo vyššie uvedenom príklade kompilátor spracoval binárne číslo na -2 v desatinnom čísle iba pre 8-bitové celé číslo so znamienkom. Preto sa print(Int8(bitPattern: 0b11111110))
na obrazovke objaví výstup -2.
Ale pre normálny typ celého čísla, ktorého veľkosť je 32/64 bitov a môže obsahovať veľké hodnoty, interpretuje hodnotu ako 254
. Z výpisu preto print(0b11111110)
vyplynie 254 na obrazovke.
2. Bitový operátor AND
Je reprezentovaný &
a môže byť použitý na dva operandy. Operátor AND porovná dva bity a vráti 1, ak sú oba bity 1, inak vráti 0.
Ak sú x a y premenné / konštantné, ktoré obsahujú binárnu hodnotu, tj 0 alebo 1. Bitovú operáciu AND na x a y môžeme znázorniť v nasledujúcej tabuľke:
AX | r | x & y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
Príklad 5: Bitová operácia AND
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)
Keď spustíte vyššie uvedený program, výstup bude:
Binárne: 10000011 131
Vo vyššie uvedenom programe príkaz let result = xBits & yBits
kombinuje bity dvoch operandov xBits a yBits. Vráti 1, obidva bity sú 1, inak vráti 0.
String(value , radix: )
Inicializátor sa používa na reprezentáciu čísla v inom číselnom systéme. Ak zadáme radixovú hodnotu 2. Konvertuje číslo na binárny číselný systém. Podobne môžeme použiť 16 pre šestnástku a 10 pre desatinné miesto.
Príkaz print("Binary:",String(result, radix: 2))
výstupy Binárne: 10000011 na obrazovke. 10000011
je ekvivalentná 131 v desatinnej čiarke, print(result)
výstup výpisu 131 v konzole.
3. Bitový operátor OR
Je znázornený ako |
a možno ho použiť na dva operandy. Bitový operátor OR porovnáva dva bity a generuje výsledok 1, ak je jeden alebo viac jeho vstupov 1, inak 0.
Ak sú x a y premenné / konštantné, ktoré obsahujú binárnu hodnotu, tj 0 alebo 1. Operáciu Bitový operátor OR na x a y môžeme znázorniť v nasledujúcej tabuľke:
ALEBOX | r | x | r |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
Príklad 6: Bitová operácia ALEBO
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
Keď spustíte vyššie uvedený program, výstup bude:
Binárne: 11111111 255
Vo vyššie uvedenom programe príkaz let result = xBits | yBits
kombinuje bity dvoch konštánt xBits a yBits. Vráti 1, ak je niektorý z bitov 1, inak vráti 0.
Príkaz print("Binary:",String(result, radix: 2))
výstupy Binárne: 11111111 na obrazovke. Pretože, 11111111
je ekvivalentné s 255
desatinnou časťou, print(result)
výstup má na obrazovke výstup 255 .
4. Bitový operátor XOR
Je znázornený ako ^
a možno ho použiť na dva operandy. Operátor XOR porovnáva dva bity a generuje výsledok 1, ak je práve jeden z jeho vstupov 1, inak vráti 0.
Ak sú x a y premenné / konštantné, ktoré majú binárnu hodnotu, tj 0 alebo 1. Bitovú operáciu XOR na x a y môžeme znázorniť v nasledujúcej tabuľke:
XORX | r | x y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
Príklad 7: Bitová operácia XOR
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result)
Keď spustíte vyššie uvedený program, výstup bude:
Binárne: 1111100 124
Vo vyššie uvedenom programe príkaz let result = xBits yBits
kombinuje bity dvoch konštánt xBits a yBits. Vráti 1, ak je práve jeden z bitov 1, inak vráti 0.
Výpis má na obrazovke print("Binary:",String(result, radix: 2))
výstup z binárneho formátu: 1111100 (ekvivalent k 01111100). Pretože, 1111100
je ekvivalentný s 124
desatinným číslom, print(result)
výstup z výpisu 124 bude na obrazovke.
5. Operátor bitového radenia
Tieto operátory sa používajú na presunutie všetkých bitov v počte doľava alebo doprava o určitý počet miest a môžu sa použiť na jeden operand. Je reprezentovaný ako <<
alebo >>
.
Existujú dva druhy operátorov zmeny:
Operátor bitovej zmeny vľavo
- Označené ako
<<
- Spôsobuje to, že sa bity posunú doľava, určené počtom, za ktorým nasleduje
<<
. - Bitové pozície, ktoré boli uvoľnené operáciou posunu, sú vyplnené nulou.
- Posunutím celočíselných bitov doľava o jednu pozíciu sa zdvojnásobí jeho hodnota
Príklad 8: Bitový operátor ľavého posunu
let someBits:UInt8 = 0b11000100 print(someBits << 1)
Keď spustíte vyššie uvedený program, výstup bude:
136
Vo vyššie uvedenom programe sme použili operátora ľavého posunu. Použitie <<
1 znamená posunutie bitu o 1 doľava. Číslice sa posunú doľava o jednu pozíciu a posledná číslica vpravo je vyplnená nulou.
Môžete tiež vidieť stratenú číslicu, ktorá sa posunie „od konca“ z ľavej strany. Opäť sa neobtočí sprava. Posunutím o jeden bit doľava odstránite 1 z binárneho súboru a pridaním 0 vpravo vyplníte posunutú hodnotu, rovnako ako ostatné bity sú posunuté smerom k ľavej polohe o 1.
Toto vráti 10001000
čo je ekvivalentné s 136
in UInt8
. Preto print(someBits << 1)
výstup výpisu 136 na obrazovke.
Operátor bitového posunu doprava
- Označené ako
>>
- Spôsobuje to, že sa bity posunú doprava o číslo, za ktorým nasleduje
>>
- Pre nepodpísané čísla sú bitové pozície, ktoré boli uvoľnené operáciou posunu, vyplnené nulou.
- Pre čísla so znamienkom (čísla, ktoré môžu byť tiež záporné) sa znakový bit používa na vyplnenie voľných pozícií bitov. Inými slovami, ak je číslo kladné, použije sa 0 a ak je číslo záporné, použije sa 1.
- Jeho posunutie doprava o jednu pozíciu zníži jeho hodnotu na polovicu.
Príklad 9: Bitový operátor posunu doprava pre celé číslo bez znamienka
let someBits: UInt8 = 4 print(someBits>> 1)
Keď spustíte vyššie uvedený program, výstup bude:
2
Vo vyššie uvedenom programe sme použili operátor pravého posunu na celé číslo bez znamienka. Použitie >>
1 znamená posunúť bit o 1 doprava. Bitové pozície, ktoré boli uvoľnené operáciou posunu, sú vždy vyplnené nulou na celé číslo bez znamienka.
Pretože 4 je reprezentovaný ako 00000100
v binárnom formáte. Ak ho posuniete o kúsok doprava, vráti 00000010
sa ekvivalent k bodu 2
in UInt8
. Preto print(someBits>> 1)
výstup výpisu 2 na obrazovke.
Príklad 10: Bitový operátor posunu doprava pre celé číslo so znamienkom
let someBits:Int = -4 print(someBits>> 1)
Keď spustíte vyššie uvedený program, výstup bude:
-2
Vo vyššie uvedenom programe sme použili operátor pravého posunu na celé číslo bez znamienka. Na rozdiel od kladných čísel sa pri >>
záporných číslach na prázdne miesto používa namiesto záporných čísel číslo 1.
Pretože, -4
je reprezentovaný ako 11111100
v binárnom formáte. Posunutím o jeden bit doprava a umiestnením 1 na prázdnu pozíciu sa vráti, 11111110
čo je ekvivalentné -2
pre Int8
typ. Preto bude print(someBits>> 1)
výstup na obrazovke -2.