V tomto kurzu se dozvíte o různých bitových operacích ve Swift. Ty se používají pro výpočet bitové úrovně ve výrazu.
Bit se používá k označení binární číslice. Binární číslice může mít dvě možné hodnoty buď 0, nebo 1. Jako programátor na úrovni začátečníka nemusíte pracovat s operacemi na bitové úrovni.
Stačí pracovat s primitivními datovými typy, jako jsou: integer, float, boolean, string atd. Možná budete muset pracovat na bitové úrovni, když máte co do činění s programováním na nízké úrovni.
Swift poskytuje kromě základních operátorů bohatou sadu operátorů pro manipulaci s bity. Tyto operátory jsou podobné logickým operátorům, kromě toho, že pracují na binárních reprezentacích dat (bitů).
Bitové operátory jsou operátory, které se používají ke změně jednotlivých bitů operandu. Operand je proměnná nebo konstanta, ve které se operace provádí.
Níže jsou uvedeny všechny bitové operátory dostupné v swiftu:
1. Bitový NOT operátor
Představuje to vlnovku ~
a lze ji použít na jeden operand. To invertuje všechny bity. tj. změní 1 na 0 a 0 na 1.
Je-li x proměnná / konstanta, která obsahuje binární hodnotu, tj. 0 nebo 1. Bitová nečinnost na proměnné x může být znázorněna v následující tabulce:
NEX | ~ x |
---|---|
0 | 1 |
1 | 0 |
Příklad 1: Bitový operátor NOT pro celé číslo bez znaménka
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Když spustíte výše uvedený program, výstup bude:
254
Ve výše uvedeném programu je příkaz let initalNumber:UInt8 = 1
typu Unsigned int o velikosti 8 bitů. Takže 1 v desítkové soustavě může být reprezentováno jako 00000001
v binárním formátu.
Bitový operátor not not changes all the bit of a variable or constant, the bit 0 is changed to 1 and 1 to 0. So invertedNumber contains bits 11111110
. Po převodu na desítkové číslo je to reprezentováno jako 254. Takže výpis print(invertedNumber)
vygeneruje 254 na obrazovce.
Můžete také provádět bitový operátor přímo v bitech jako:
Příklad 2: Bitový operátor NOT v bitech
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
Když spustíte výše uvedený program, výstup bude:
0
initialBits obsahuje binární hodnotu, 11111111
která odpovídá 255 v desítkové soustavě. Abychom reprezentovali číslo v binární 0b
podobě, máme jako předponu v literálu. Bez 0b
předpony to bude považovat za normální celé číslo a dostanete chybu přetečení (UInt8 může ukládat čísla pouze od 0 do 255).
Protože jsme použili bitový ne operátor, změní všechny 1 na 0. Takže konstanta invertedBits obsahuje, 00000000
což je ekvivalentní 0 v UInt8
.
Příklad 3: Bitový operátor NOT pro celé číslo se znaménkem
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Když spustíte výše uvedený program, výstup bude:
-2
Ve výše uvedeném programu lze 1 v desítkové soustavě reprezentovat jako 00000001
v binárním formátu . Bitový operátor not not changes all the bit of a variable or constant, the bit 0 is changed to 1 and 1 to 0. So, invertedNumber contains bits 11111110
. To by mělo na obrazovce vyprodukovat 254. Ale místo toho vrátí -2. Zvláštní, že? Prozkoumejme níže, jak se to stalo.
let initalNumber:Int = 1
je podepsaný int, který může obsahovat pozitivní i negativní celá čísla. To je důvod, proč když jsme pro celé číslo se znaménkem použili not operator, vrácená binárka může také představovat záporné číslo.
Jak překladač interpretoval -2 jako 11111110
v binárním formátu?
Kompilátor použil dva komplement k reprezentaci celých čísel. Chcete-li získat zápornou notaci celého čísla komplementu dvou, měli byste nejprve napsat číslo v binárním formátu, potom převrátit číslice a přidat jednu k výsledku.
Kroky k nalezení doplňku Two -2 :
- Napište 2 v binární podobě:
00000010
- Obraťte číslice. 0 se stane 1 a 1 se stane 0:
11111101
- Přidat 1:
11111110
Tak překladač interpretuje binární číslo 1111110
jako -2
v desítkové soustavě. Ale kompilátor udělal trochu zvrat, který jsme si nevšimli. Také odvodil typ invertedNumber jako Int8
typ.
Abychom tomu porozuměli, podívejme se na příklad níže:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
Když spustíte výše uvedený program, výstup bude:
-2 254
Ve výše uvedeném příkladu kompilátor zpracoval binární číslo na -2 v desítkové soustavě pouze pro podepsané 8bitové celé číslo. Proto se print(Int8(bitPattern: 0b11111110))
na obrazovce objeví výstup -2.
Ale pro normální celočíselný typ, jehož velikost je 32/64 bitů a může obsahovat velké hodnoty, interpretuje hodnotu jako 254
. Z tohoto důvodu print(0b11111110)
výstup výpisu 254 na obrazovce.
2. Bitový operátor AND
Je reprezentován &
a lze jej použít na dva operandy. Operátor AND porovná dva bity a vrátí 1, pokud jsou oba bity 1, jinak vrátí 0.
Pokud x a y jsou proměnné / konstantní, které mají binární hodnotu, tj. 0 nebo 1. Operaci Bitový součin na xay lze znázornit v následující tabulce:
AX | y | x & y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
Příklad 5: Bitová operace AND
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)
Když spustíte výše uvedený program, výstup bude:
Binární: 10000011131
Ve výše uvedeném programu příkaz let result = xBits & yBits
kombinuje bity dvou operandů xBits a yBits. Vrací 1, oba bity jsou 1, jinak vrátí 0.
String(value , radix: )
Inicializátor se používá k reprezentaci čísla v jiném číselném systému. Pokud zadáme radixovou hodnotu 2. Převede číslo na binární číselný systém. Podobně můžeme použít 16 pro hexadecimální a 10 pro desetinná místa.
Výpis na obrazovce print("Binary:",String(result, radix: 2))
vydá Binární: 10000011 . 10000011
je ekvivalentní 131 v desítkové soustavě, print(result)
výstup příkazu 131 v konzole.
3. Bitový operátor OR
Je reprezentován jako |
a může být použit na dva operandy. Bitový operátor OR porovnává dva bity a generuje výsledek 1, pokud je jeden nebo více jeho vstupů 1, jinak 0.
Pokud jsou xay proměnné / konstantní, které mají binární hodnotu, tj. 0 nebo 1. Operaci Bitový součet OR na xay lze znázornit v následující tabulce:
NEBOX | y | x | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
Příklad 6: Bitová operace NEBO
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
Když spustíte výše uvedený program, výstup bude:
Binární: 11111111 255
Ve výše uvedeném programu příkaz let result = xBits | yBits
kombinuje bity dvou konstant xBits a yBits. Vrátí 1, pokud je některý z bitů 1, jinak vrátí 0.
Výpis na obrazovce print("Binary:",String(result, radix: 2))
vydá Binární: 11111111 . Vzhledem k tomu, že 11111111
je ekvivalentní 255
v desítkové soustavě, je na print(result)
výstupu výpisu 255 .
4. Bitový operátor XOR
Je reprezentován jako ^
a může být použit na dva operandy. Operátor XOR porovná dva bity a vygeneruje výsledek 1, pokud je přesně jeden z jeho vstupů 1, jinak vrátí 0.
Pokud jsou x a y proměnné / konstantní, které mají binární hodnotu, tj. 0 nebo 1. Operaci bitového XOR na x a y lze znázornit v následující tabulce:
XORX | y | x y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
Příklad 7: Bitová operace XOR
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result)
Když spustíte výše uvedený program, výstup bude:
Binární: 1111100 124
Ve výše uvedeném programu příkaz let result = xBits yBits
kombinuje bity dvou konstant xBits a yBits. Vrátí 1, pokud je právě jedna z bitů 1, jinak vrátí 0.
Výpis print("Binary:",String(result, radix: 2))
vydává na obrazovce binární: 1111100 (ekvivalent 01111100). Protože, 1111100
je ekvivalentní 124
v desítkové soustavě, print(result)
výstup výpisu 124 na obrazovce.
5. Operátor bitového posunu
Tyto operátory se používají k přesunutí všech bitů v čísle doleva nebo doprava o určitý počet míst a lze je použít na jeden operand. Je reprezentován jako <<
nebo >>
.
Existují dva druhy operátorů směn:
Bitový operátor řazení vlevo
- Označeno jako
<<
- Způsobí to, že se bity posunou doleva, určené číslem, za kterým následuje
<<
. - Bitové pozice, které byly uvolněny operací posunu, jsou vyplněny nulou.
- Posunutí celočíselných bitů doleva o jednu pozici zdvojnásobí jeho hodnotu
Příklad 8: Bitový operátor řazení vlevo
let someBits:UInt8 = 0b11000100 print(someBits << 1)
Když spustíte výše uvedený program, výstup bude:
136
Ve výše uvedeném programu jsme použili operátor levého posunu. Použití <<
1 znamená posunout bit o 1 doleva. Číslice se posunou doleva o jednu pozici a poslední číslice vpravo je vyplněna nulou.
Můžete také vidět, že číslice, která se posune „od konce“ z levé strany, je ztracena. Znovu se neobtočí zprava. Posunutím o jeden bit doleva odstraníte 1 z binárního souboru a přidáte 0 vpravo, abyste vyplnili posunutou hodnotu, stejně jako ostatní bity jsou posunuty směrem doleva o 1.
To se vrací, 10001000
což je ekvivalentní 136
v UInt8
. Z tohoto důvodu print(someBits << 1)
výstup výpisu 136 na obrazovce.
Bitový operátor posunu doprava
- Označeno jako
>>
- Způsobí to, že se bity posunou doprava o číslo, za kterým následuje
>>
- U nepodepsaných čísel jsou bitové pozice, které byly uvolněny operací posunu, vyplněny nulou.
- U podepsaných čísel (čísla, která mohou být také záporná) se bit znaménka používá k vyplnění uvolněných bitových pozic. Jinými slovy, pokud je číslo kladné, použije se 0 a pokud je číslo záporné, použije se 1.
- Posunutím doprava o jednu pozici snížíte jeho hodnotu na polovinu.
Příklad 9: Bitový operátor posunu doprava pro celé číslo bez znaménka
let someBits: UInt8 = 4 print(someBits>> 1)
Když spustíte výše uvedený program, výstup bude:
2
Ve výše uvedeném programu jsme použili operátor posunu doprava na celé číslo bez znaménka. Použití >>
1 znamená posunout bit o 1 doprava. Bitové pozice, které byly uvolněny operací posunu, jsou vždy vyplněny nulou na celé číslo bez znaménka.
Protože 4 je reprezentován jako 00000100
v binárním formátu. Posunutím o jeden kousek doprava se vrátí, 00000010
což je ekvivalent 2
in UInt8
. Z tohoto důvodu print(someBits>> 1)
výstup výpisu 2 na obrazovce.
Příklad 10: Bitový operátor posunu doprava pro celé číslo se znaménkem
let someBits:Int = -4 print(someBits>> 1)
Když spustíte výše uvedený program, výstup bude:
-2
Ve výše uvedeném programu jsme použili operátor posunu doprava na celé číslo bez znaménka. Na rozdíl od kladných čísel se >>
pro záporná čísla používá 1 k vyplnění volného místa, místo 0.
Protože, -4
je reprezentován jako 11111100
v binárním formátu. Posunutím o jeden bit doprava a umístěním 1 na prázdnou pozici se vrátí, 11111110
což je ekvivalentní -2
pro Int8
typ. Proto se print(someBits>> 1)
na obrazovce zobrazí výstup -2.