Swift Bitwise- ja Bit Shift -operaattorit (esimerkkejä)

Tässä opetusohjelmassa opit erilaisista bittinopeuksisista toiminnoista Swiftissä. Näitä käytetään bittitason laskennassa lausekkeessa.

Bittiä käytetään binääriluvun merkitsemiseen. Binaariluvulla voi olla kaksi mahdollista arvoa joko 0 tai 1. Aloittelijan tason ohjelmoijana sinun ei tarvitse työskennellä bittitason operaatioiden kanssa.

Työskentely primitiivisillä tietotyypeillä, kuten: kokonaisluku, kelluva, looginen, merkkijono jne., Riittää. Saatat joutua työskentelemään bittitasolla, kun olet tekemisissä matalan tason ohjelmoinnin kanssa.

Swift tarjoaa monipuoliset operaattorit, paitsi perusoperaattorit, bittien manipulointiin. Nämä operaattorit ovat samanlaisia ​​kuin loogiset operaattorit, paitsi että ne työskentelevät datan (bittiä) binäärisillä esityksillä.

Bittikohtaiset operaattorit ovat operaattoreita, joita käytetään operandin yksittäisten bittien muuttamiseen. Operandi on muuttuja tai vakio, jossa operaatio suoritetaan.

Kaikki nopeassa muodossa olevat bittioperaattorit on lueteltu alla:

1. Bittikohtaisesti EI operaattoria

Sitä edustaa tilde- ~merkki ja sitä voidaan käyttää yhdessä operandissa. Tämä kääntää kaikki bitit. eli muuttuu 1: stä 0: een ja 0: sta 1: een.

Jos x on muuttuja / vakio, jolla on binaarinen arvo eli 0 tai 1. X-muuttujan bittikohtainen ei-operaatio voidaan esittää alla olevassa taulukossa:

EI
x ~ x
0 1
1 0

Esimerkki 1: Bittikohtaisesti EI-operaattori allekirjoittamattomalle kokonaisluvulle

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

Kun suoritat yllä olevan ohjelman, tulos on:

 254

Yllä olevassa ohjelmassa lause let initalNumber:UInt8 = 1on tyyppiä Unsigned int, jonka koko on 8 bittiä. Joten 1 desimaaliluvulla voidaan esittää kuten 00000001binäärimuodossa.

Bittikohtainen ei-operaattori muuttaa kaikki muuttujan tai vakion bitit, bitti 0 muutetaan arvoksi 1 ja 1 arvoksi 0. Joten invertedNumber sisältää bittejä 11111110. Sen jälkeen kun se on muunnettu desimaaliksi, se esitetään muodossa 254. Lauseke print(invertedNumber)antaa 254 näytöllä.

Voit suorittaa myös bittioperaattorin suoraan bitteinä seuraavasti:

Esimerkki 2: Bittikohtainen EI-operaattori bitteinä

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

Kun suoritat yllä olevan ohjelman, tulos on:

 0

initialBits sisältää binääriarvon, 11111111joka vastaa 255 desimaalilukuna. Numeron edustamiseksi binäärisenä meillä on 0betuliite kirjaimessa. Ilman 0betuliitettä se käsittelee sitä normaalina kokonaislukuna ja saat ylivuotovirheen (UInt8 voi tallentaa numeroita vain 0: stä 255: een).

Koska olemme käyttäneet bittikohtaisesti ei operaattoria, se muuttaa kaikki arvot arvoksi 0. Joten vakio invertedBits sisältää arvon, 00000000joka vastaa 0 tuumaa UInt8.

Esimerkki 3: Allekirjoitetun kokonaisluvun operaattori bittikohtaisesti EI

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

Kun suoritat yllä olevan ohjelman, tulos on:

 -2

Yllä olevassa ohjelmassa 1 desimaaliluvulla voidaan esittää 00000001binäärisenä. Bittikohtainen ei-operaattori muuttaa kaikki muuttujan tai vakion bitit, bitti 0 muutetaan arvoksi 1 ja 1 arvoksi 0. Joten, invertedNumber sisältää bittejä 11111110. Tämän pitäisi antaa näytölle 254. Mutta sen sijaan palauttaa -2. Outoa, eikö? Tutkitaan alla, miten tämä tapahtui.

let initalNumber:Int = 1on allekirjoitettu int, johon voi sisältyä sekä positiivisia että negatiivisia kokonaislukuja. Siksi, kun käytimme ei-operaattoria allekirjoitettuun kokonaislukuun, palautettu binääri voi myös edustaa negatiivista lukua.

Kuinka kääntäjä tulkitsi -2 11111110 : n binäärisenä?

Kääntäjä käytti kahden täydennystä edustamaan kokonaislukuja. Saadaksesi kahden komplementin negatiivisen kokonaisluvun merkinnän, sinun on ensin kirjoitettava luku binäärisenä, käännettävä sitten numerot ja lisättävä yksi tulokseen.

Vaiheet selvittääksesi kahden komplementin -2 : sta:

  1. Kirjoita 2 binäärimuodossa: 00000010
  2. Käännä numerot. 0: sta tulee 1 ja 1: stä 0:11111101
  3. Lisää 1: 11111110

Niin kääntäjä tulkitsee binääriluku 1111110kuin -2desimaali. Mutta kääntäjällä on pieni käänne, jota emme huomanneet. Se päätti myös tyypin invertedNumber Int8tyypin.

Tämän ymmärtämiseksi katsotaan alla oleva esimerkki:

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

Kun suoritat yllä olevan ohjelman, tulos on:

 -2 254

Yllä olevassa esimerkissä kääntäjä käsitteli binääriluvun -2 desimaaleina vain allekirjoitetulle 8-bittiselle kokonaisluvulle. Siksi lause print(Int8(bitPattern: 0b11111110))tuottaa näytöllä -2.

Mutta normaalille kokonaislukutyypille, jonka koko on 32/64 bittiä ja johon mahtuu suuria arvoja, se tulkitsee arvon 254. Siksi lauseke print(0b11111110)antaa näytölle 254 .

2. Bittikohtaisesti JA operaattori

Sitä edustaa &ja sitä voidaan soveltaa kahteen operandiin. AND-operaattori vertaa kahta bittiä ja palauttaa 1, jos molemmat bitit ovat 1, muuten palauttaa 0.

Jos x ja y ovat muuttujia / vakioita, joka pitää binääriarvon eli 0 tai 1. Bit-AND-operaatio x: llä ja y: llä voidaan esittää alla olevassa taulukossa:

JA
x y x & y
0 0 0
0 1 0
1 1 1
1 0 0

Esimerkki 5: Bittisuuntainen JA -käyttö

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

Kun suoritat yllä olevan ohjelman, tulos on:

 Binaarinen: 10000011131 

Yllä olevassa ohjelmassa lause let result = xBits & yBitsyhdistää kahden operandin xBits ja yBits bitit. Se palauttaa 1, molemmat bitit ovat 1, muuten se palauttaa 0.

String(value , radix: )alustuslaitetta käytetään edustamaan lukua eri numerojärjestelmässä. Jos toimitamme radix-arvon 2. Se muuntaa luvun binäärilukujärjestelmäksi. Vastaavasti voimme käyttää 16: ta heksadesimaalille ja 10: tä desimaalille.

Lausunto print("Binary:",String(result, radix: 2))antaa näytölle Binary: 10000011 . 10000011vastaa desimaalilukua 131, käsky print(result)antaa konsoliin 131.

3. Bittikohtaisesti TAI operaattori

Se on esitetty |ja sitä voidaan soveltaa kahteen operandiin. Bittikohtainen TAI-operaattori vertaa kahta bittiä ja tuottaa tuloksen 1, jos yksi tai useampi sen tuloista on 1 muuten 0.

Jos x ja y ovat muuttujia / vakioita, joka pitää binääriarvon, ts. 0 tai 1. Bit-OR-operaatio x: llä ja y: llä voidaan esittää alla olevassa taulukossa:

TAI
x y x | y
0 0 0
0 1 1
1 1 1
1 0 1

Esimerkki 6: Bittisuuntainen TAI-toiminto

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

Kun suoritat yllä olevan ohjelman, tulos on:

 Binaarinen: 11111111 255 

Yllä olevassa ohjelmassa lause let result = xBits | yBitsyhdistää kahden vakion xBits ja yBits bitit. Se palauttaa 1, jos jokin biteistä on 1, muuten se palauttaa 0.

Lausunto print("Binary:",String(result, radix: 2))antaa näytölle Binary: 11111111 . Koska, 11111111vastaa 255desimaalia, lauseke print(result)antaa näytölle 255 .

4. Bittikohtainen XOR-operaattori

Se on esitetty ^ja sitä voidaan soveltaa kahteen operandiin. XOR-operaattori vertaa kahta bittiä ja tuottaa tuloksen 1, jos täsmälleen yksi sen tuloista on 1, muuten se palauttaa 0.

Jos x ja y ovat muuttujia / vakioita, joka pitää binääriarvon eli 0 tai 1. Bit-XOR-operaatio x: llä ja y: llä voidaan esittää alla olevassa taulukossa:

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

Esimerkki 7: XOR-toiminto bitteittäin

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

Kun suoritat yllä olevan ohjelman, tulos on:

 Binaarinen: 1111100124 

Yllä olevassa ohjelmassa lause let result = xBits yBitsyhdistää kahden vakion xBits ja yBits bitit. Se palauttaa 1, jos tarkalleen yksi biteistä on 1, muuten se palauttaa 0.

Lausunto print("Binary:",String(result, radix: 2))antaa näytölle Binary: 1111100 (vastaa 01111100). Koska, 1111100vastaa 124desimaalilukua, käsky print(result)antaa näytölle 124 .

5. Vaihto-ohjain bittikohtaisesti

Tätä operaattoria käytetään siirtämään kaikki numerobitit vasemmalle tai oikealle tietyllä määrällä paikkoja, ja niitä voidaan käyttää yhdellä operandilla. Sitä edustaa <<tai >>.

Vaihto-operaattoreita on kahdenlaisia:

Vasenkätinen vasemmanpuoleinen ohjain

  • Merkitty nimellä <<
  • Se aiheuttaa bittien siirtymisen vasemmalle, jonka määrittelee numero ja sen jälkeen <<.
  • Siirtotoiminnolla vapautetut bittipaikat ovat nollatäytteisiä.
  • Jos kokonaislukubittiä siirretään vasemmalle yhdellä paikalla, sen arvo kaksinkertaistuu

Esimerkki 8: Vasenkätinen vasenkätinen operaattori

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

Kun suoritat yllä olevan ohjelman, tulos on:

 136

Yllä olevassa ohjelmassa olemme käyttäneet vasemman vaiheen operaattoria. Käyttämällä <<1 tarkoittaa siirtää bittiä 1 vasemmalle. Numerot siirtyvät vasemmalle yhdellä paikalla, ja viimeinen numero oikealla on nolla.

Voit myös nähdä, että numero, joka siirtyy vasemmalta puolelta "loppupäähän" , on kadonnut. Se ei kääri uudestaan ​​oikealta. Siirtämällä sitä yhdellä bitillä vasemmalle, 1 poistetaan binaarista ja lisätään 0 oikealle täyttämään siirretty arvo, samoin kuin muut muut bitit siirtyvät vasemmalle 1.

Tämä tuotto 10001000, joka vastaa 136sisään UInt8. Siksi print(someBits << 1)lauseke antaa näytölle 136 .

Oikeavaihteinen kuljettaja

  • Merkitty nimellä >>
  • Se aiheuttaa bittien siirtymisen oikealle numerolla, jota seuraa >>
  • Allekirjoittamattomille numeroille bittiasemat, jotka on vapautettu siirtotoiminnolla, ovat nollatäytteisiä.
  • Allekirjoitetuille numeroille (numerot, jotka voivat myös olla negatiivisia), merkkibittiä käytetään täyttämään vapautuneet bittiasemat. Toisin sanoen, jos luku on positiivinen, käytetään 0 ja jos luku on negatiivinen, käytetään 1.
  • Siirtäminen oikealle yhdellä asennolla puolittaa sen arvon.

Esimerkki 9: Oikean siirtymän operaattori bittikohtaisesti allekirjoittamattomalle kokonaisluvulle

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

Kun suoritat yllä olevan ohjelman, tulos on:

 2

Yllä olevassa ohjelmassa olemme käyttäneet oikean siirtymän operaattoria allekirjoittamattomalla kokonaisluvulla. Käyttämällä >>1 tarkoittaa bitin siirtämistä yhdellä oikealle. Bittiasemat, jotka on vapautettu siirtotoiminnolla, täytetään aina nollalla allekirjoittamattomalla kokonaisluvulla.

Koska 4 on esitetty 00000100binäärisenä. Siirtämällä sitä vähän bitti oikealle, palaa 00000010mikä vastaa 2in- arvoa UInt8. Siksi print(someBits>> 1)lauseke antaa näytölle 2.

Esimerkki 10: Oikean siirtymän operaattori bitin mukaan allekirjoitetulle kokonaisluvulle

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

Kun suoritat yllä olevan ohjelman, tulos on:

 -2

Yllä olevassa ohjelmassa olemme käyttäneet oikean siirtymän operaattoria allekirjoittamattomalla kokonaisluvulla. Toisin kuin positiiviset luvut, >>negatiivisilla numeroilla käytetään 1 tyhjän paikan täyttämiseen 0: n sijasta.

Koska, -4on esitetty kuten 11111100binäärimuodossa. Siirtämällä se yhden bitin oikealle ja sijoittamalla 1 vapautunut asennossa, tuotto 11111110joka vastaa -2varten Int8tyyppi. Siksi print(someBits>> 1)lause antaa näytöllä -2.

Mielenkiintoisia artikkeleita...