Operátoři Swift Bitwise a Bit Shift (s příklady)

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:

NE
X ~ 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 = 1typu Unsigned int o velikosti 8 bitů. Takže 1 v desítkové soustavě může být reprezentováno jako 00000001v 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, 11111111která odpovídá 255 v desítkové soustavě. Abychom reprezentovali číslo v binární 0bpodobě, máme jako předponu v literálu. Bez 0bpř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, 00000000což 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 00000001v 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 = 1je 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 :

  1. Napište 2 v binární podobě: 00000010
  2. Obraťte číslice. 0 se stane 1 a 1 se stane 0:11111101
  3. Přidat 1: 11111110

Tak překladač interpretuje binární číslo 1111110jako -2v desítkové soustavě. Ale kompilátor udělal trochu zvrat, který jsme si nevšimli. Také odvodil typ invertedNumber jako Int8typ.

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:

A
X 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 & yBitskombinuje 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 . 10000011je 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:

NEBO
X 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 | yBitskombinuje 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 11111111je ekvivalentní 255v 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:

XOR
X 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 yBitskombinuje 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, 1111100je ekvivalentní 124v 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í, 10001000což je ekvivalentní 136v 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 00000100v binárním formátu. Posunutím o jeden kousek doprava se vrátí, 00000010což je ekvivalent 2in 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, -4je reprezentován jako 11111100v binárním formátu. Posunutím o jeden bit doprava a umístěním 1 na prázdnou pozici se vrátí, 11111110což je ekvivalentní -2pro Int8typ. Proto se print(someBits>> 1)na obrazovce zobrazí výstup -2.

Zajímavé články...