Swift bitenkénti és biteltolásos operátorok (példákkal)

Ebben az oktatóanyagban megismerheti a Swift különböző bitenkénti műveleteit. Ezeket egy kifejezés bitszintű számításához használják.

A bitet bináris számjegy jelölésére használják. A bináris számjegyeknek két lehetséges értéke lehet 0 vagy 1. Kezdő szintű programozóként nem kell bitszintű műveletekkel dolgozni.

Elég olyan primitív adattípusokkal dolgozni, mint: egész szám, float, logikai érték, string stb. Alacsony szintű programozással lehet, hogy bitszinten kell dolgoznia.

A Swift az operátorok kivételével gazdag operátorokat kínál a bitek manipulálására. Ezek az operátorok hasonlóak a logikai operátorokhoz, kivéve, hogy az adatok (bitek) bináris ábrázolásán dolgoznak.

A bitenkénti operátorok olyan operátorok, amelyek az operandus egyes bitjeinek megváltoztatására szolgálnak. Az operandus olyan változó vagy állandó, amelyben a műveletet végezzük.

Az összes böngészőnként elérhető gyors operátor az alábbiakban szerepel:

1. Bitenként NEM kezelő

Tilde ~jellel ábrázolva, egyetlen operanduson alkalmazható. Ez megfordítja az összes bitet. azaz 1-ről 0-ra és 0-ról 1-re változik.

Ha x olyan változó / konstans, amely bináris értéket tartalmaz, azaz 0 vagy 1. Az x változó bitenként végrehajtott művelete az alábbi táblázatban ábrázolható:

NEM
x ~ x
0 1
1 0

1. példa: Bitenként NEM operátor az aláíratlan egész számhoz

 let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber) 

A fenti program futtatásakor a kimenet a következő lesz:

 254

A fenti programban az utasítás let initalNumber:UInt8 = 1Unsigned int típusú, 8 bit méretű. Tehát 1 tizedesjegyben ábrázolható, mint 00000001bináris.

A bitenként nem operátor megváltoztatja egy változó vagy konstans összes bitjét, a 0 bit 1-re és 1-re 0-ra változik. Tehát az invertedNumber biteket tartalmaz 11111110. Miután decimálissá konvertálta, 254-ként ábrázolják. Tehát az utasítás print(invertedNumber)254-et ad ki a képernyőn.

A bitenkénti operátort közvetlenül a bitekben is végrehajthatja:

2. példa: Bitenként NEM operátor

 let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits) 

A fenti program futtatásakor a kimenet a következő lesz:

 0

Az initialBits bináris értéket tartalmaz 11111111, amely decimálisban 255-nek felel meg. A szám bináris alakban való ábrázolásához 0belőtagként szerepelünk a literálban. 0bElőtag nélkül normál egész számként fogja kezelni, és túlcsordulási hibát kap (az UInt8 csak 0 és 255 közötti számokat képes tárolni).

Mivel bitenként nem operátort használtunk, az összes 1-et 0-ra változtatja. Tehát az invertedBits konstans tartalmaz 000000000-nak megfelelő értéket UInt8.

3. példa: Bitenként NEM operátor az aláírt egész számhoz

 let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber) 

A fenti program futtatásakor a kimenet a következő lesz:

 -2

A fenti programban 1 tizedesjegyben ábrázolható, mint 00000001bináris. A bitenként nem operátor megváltoztatja a változó vagy konstans összes bitjét, a 0 bit 1-re és 1-re 0-ra változik. Tehát az invertedNumber biteket tartalmaz 11111110. Ennek 254-et kell kiadnia a képernyőn. De ehelyett -2-t ad vissza. Furcsa, ugye ?? Fedezzük fel alább, hogy történt ez.

let initalNumber:Int = 1egy előjeles int, amely pozitív és negatív egész számokat egyaránt tartalmazhat. Ezért, amikor nem operátort alkalmaztunk aláírt egész számra, a visszaküldött bináris is negatív számot jelenthet.

Hogyan értelmezte a fordító a -2-t 11111110 binárisként?

A fordító Two-komplementerrel egész számokat ábrázolt. A kettő egészének negatív komplement negatív jelölésének megszerzéséhez először ki kell írnia a számot bináris formában, majd meg kell fordítania a számokat, és hozzá kell adnia egyet az eredményhez.

Lépések a -2-es kettő kiegészítésének megismerésére :

  1. Írja a 2-et bináris formában: 00000010
  2. Fordítsa meg a számjegyeket. 0 lesz 1, és 1 011111101
  3. 1: 11111110

Így értelmezi a fordító a bináris számot, 1111110mint -2tizedesjegyet. De van egy kis fordulat, amit a fordító tett, amit nem vettünk észre. Arra is következtetett, hogy típusa az invertedNumber Int8.

Ennek megértéséhez nézzünk meg egy példát alább:

 print(Int8(bitPattern: 0b11111110)) print(0b11111110)

A fenti program futtatásakor a kimenet a következő lesz:

 -2 254

A fenti példában a fordító a bináris számot -2-ig tizedesjegyig kezelte csak az aláírt 8 bites egész számra. Ezért az utasítás print(Int8(bitPattern: 0b11111110))-2-t ad ki a képernyőn.

De a normál egész típusú típushoz, amelynek mérete 32/64 bites és nagy értékeket képes tárolni, az értéket úgy értelmezi 254. Ezért az utasítás az 254print(0b11111110) kimenetet adja ki a képernyőn.

2. Bitenkénti ÉS kezelő

&Két operandus képviseli és alkalmazható. Az AND operátor összehasonlítja két bitet és 1-et ad vissza, ha mindkét bit 1, különben 0-t ad vissza.

Ha x és y változó / állandó, akkor bináris értéket tart, azaz 0 vagy 1. Az x és y bitenkénti ÉS művelete az alábbi táblázatban ábrázolható:

ÉS
x y x & y
0 0 0
0 1 0
1 1 1
1 0 0

5. példa: Bitenkénti ÉS művelet

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)

A fenti program futtatásakor a kimenet a következő lesz:

 Bináris: 10000011 131 

A fenti programban az utasítás let result = xBits & yBitskét operandus bitjeit egyesíti: xBits és yBits. 1-et ad vissza, mindkét bit 1, különben 0-t ad vissza.

String(value , radix: )az inicializáló a szám különféle számrendszerben való ábrázolására szolgál. Ha a 2. radix értéket adjuk meg, akkor a számot bináris számrendszerré alakítja. Hasonlóképpen használhatunk 16-ot hexa és 10-et tizedesre.

A nyilatkozat print("Binary:",String(result, radix: 2))kimenetek Binary: 10000011 a képernyőn. 10000011egyenértékű tizedesjegyű 131-gyel, az utasítás print(result)a konzolban adja ki a 131-et.

3. Bitenként VAGY kezelő

|Két operanduson ábrázolható és alkalmazható. A bitenkénti OR operátor két bitet hasonlít össze és 1 eredményt generál, ha egy vagy több bemenete 1, különben 0.

Ha x és y változó / állandó, akkor bináris érték, azaz 0 vagy 1. Az x és y bitenkénti OR művelete az alábbi táblázatban ábrázolható:

VAGY
x y x | y
0 0 0
0 1 1
1 1 1
1 0 1

6. példa: Bitenkénti VAGY művelet

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result) 

A fenti program futtatásakor a kimenet a következő lesz:

 Bináris: 11111111 255 

A fenti programban az utasítás let result = xBits | yBitskét xBits és yBits konstans bitjét egyesíti. 1-et ad vissza, ha bármelyik bit 1, különben 0-t ad vissza.

A nyilatkozat print("Binary:",String(result, radix: 2))kimenetek Binary: 11111111 a képernyőn. Mivel 11111111egyenértékű 255decimális nyilatkozatot print(result)kiadja 255 a képernyőn.

4. Bitenként XOR operátor

^Két operanduson ábrázolható és alkalmazható. Az XOR operátor két bitet hasonlít össze és 1 eredményt generál, ha pontosan az egyik bemenete 1, különben 0-t ad vissza.

Ha x és y változó / állandó, akkor bináris érték, azaz 0 vagy 1. Az x és y bitenkénti XOR művelete az alábbi táblázatban látható:

XOR
x y x y
0 0 0
0 1 1
1 1 0
1 0 1

7. példa: Bitenként XOR művelet

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result) 

A fenti program futtatásakor a kimenet a következő lesz:

 Bináris: 1111100 124 

A fenti programban az utasítás let result = xBits yBitskét xBits és yBits konstans bitjét egyesíti. 1-et ad vissza, ha pontosan az egyik bit 1, különben 0-t ad vissza.

Az utasítás print("Binary:",String(result, radix: 2))kimeneti bináris: 1111100 (egyenértékű 01111100) a képernyőn. Mivel 1111100egyenértékű 124decimális nyilatkozatot print(result)kiadja a 124 a képernyőn.

5. Bitenkénti váltás kezelője

Ezeket az operátorokat arra használjuk, hogy egy számban lévő összes bitet bizonyos számú helyzettel balra vagy jobbra mozgassunk, és egyetlen operandusra alkalmazhatók. Úgy ábrázolják <<vagy >>.

Kétféle műszakvezető létezik:

Bitenkénti bal váltás kezelője

  • Jelölése: <<
  • A bitek balra tolódását okozza, amelyet a szám követ <<.
  • Az eltolási művelettel megüresedett bitpozíciók nullával vannak töltve.
  • Egy egész bit bitjének balra tolása egy pozícióval megduplázza az értékét

8. példa: Bitenkénti bal váltás operátor

 let someBits:UInt8 = 0b11000100 print(someBits << 1) 

A fenti program futtatásakor a kimenet a következő lesz:

 136

A fenti programban bal váltás operátort használtunk. Az <<1 használata azt jelenti, hogy a bitet 1-gyel balra toljuk. A számjegyek egy pozícióval balra tolódnak, és a jobb oldali utolsó számjegy nulla lesz.

Láthatja azt a számjegyet is, amely a bal oldalról "a végéről" tolódik el. Jobbról nem tekeredik újra körbe. Ha egy kicsit balra tolja, akkor az 1-et eltávolítja a binárisból, és jobbra 0-t ad hozzá, hogy kitöltse az eltolt értéket, valamint a többi többi bit 1-rel elmozdul a bal helyzet felé.

Ez visszatér 10001000amely egyenértékű 136a UInt8. Ezért az print(someBits << 1)utasítás a képernyőn 136-ot ad ki.

Bitenkénti jobbra váltás kezelője

  • Jelölése: >>
  • Ez azt okozza, hogy a biteket jobbra tolja az utána következő szám >>
  • Aláíratlan számok esetében a váltási művelettel megüresedett bitpozíciók nullával vannak kitöltve.
  • Aláírt számok (számok, amelyek szintén lehetnek negatívak) esetén a jelbitet a megüresedett bitpozíciók betöltésére használják. Más szavakkal, ha a szám pozitív, 0-t használunk, és ha a szám negatív, akkor 1-et használunk.
  • Ha egy pozícióval jobbra tolja, az értéke felére csökken.

9. példa: Aláíratlan jobbra váltás operátor aláíratlan egész számhoz

 let someBits: UInt8 = 4 print(someBits>> 1) 

A fenti program futtatásakor a kimenet a következő lesz:

 2

A fenti programban jobbra váltás operátort használtunk előjel nélküli egész számra. Az >>1 használata azt jelenti, hogy a bitet 1-rel jobbra tolja. Az eltolási művelettel megüresedett bitpozíciók mindig nullával vannak kitöltve egy előjel nélküli egész számra.

Mivel a 4 úgy van ábrázolva, mint 00000100a bináris. Ha egy kicsit jobbra tolja, akkor visszatér, 00000010ami egyenértékű az 2in értékkel UInt8. Ezért az print(someBits>> 1)utasítás kimenetet jelenít meg a képernyőn.

10. példa: Jobbra tolás operátor bitenként, aláírt egész számhoz

 let someBits:Int = -4 print(someBits>> 1) 

A fenti program futtatásakor a kimenet a következő lesz:

 -2

A fenti programban jobbra váltás operátort használtunk előjel nélküli egész számra. A pozitív számokkal ellentétben, >>a negatív számoknál 1-et használunk a megüresedett hely betöltésére, 0 helyett.

Mivel a, bináris formában -4van ábrázolva 11111100. Ha egy kicsit jobbra tolja, és 1-et üres pozícióba helyez, akkor 11111110ez visszatér -2a Int8típushoz. Ezért az print(someBits>> 1)utasítás -2-t ad ki a képernyőn.

érdekes cikkek...