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:
EIx | ~ 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 = 1
on tyyppiä Unsigned int, jonka koko on 8 bittiä. Joten 1 desimaaliluvulla voidaan esittää kuten 00000001
binää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, 11111111
joka vastaa 255 desimaalilukuna. Numeron edustamiseksi binäärisenä meillä on 0b
etuliite kirjaimessa. Ilman 0b
etuliitettä 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, 00000000
joka 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ää 00000001
binää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 = 1
on 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:
- Kirjoita 2 binäärimuodossa:
00000010
- Käännä numerot. 0: sta tulee 1 ja 1: stä 0:
11111101
- Lisää 1:
11111110
Niin kääntäjä tulkitsee binääriluku 1111110
kuin -2
desimaali. Mutta kääntäjällä on pieni käänne, jota emme huomanneet. Se päätti myös tyypin invertedNumber Int8
tyypin.
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:
JAx | 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 & yBits
yhdistää 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 . 10000011
vastaa 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:
TAIx | 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 | yBits
yhdistää 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, 11111111
vastaa 255
desimaalia, 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:
XORx | 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 yBits
yhdistää 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, 1111100
vastaa 124
desimaalilukua, 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 136
sisää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 00000100
binäärisenä. Siirtämällä sitä vähän bitti oikealle, palaa 00000010
mikä vastaa 2
in- 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, -4
on esitetty kuten 11111100
binäärimuodossa. Siirtämällä se yhden bitin oikealle ja sijoittamalla 1 vapautunut asennossa, tuotto 11111110
joka vastaa -2
varten Int8
tyyppi. Siksi print(someBits>> 1)
lause antaa näytöllä -2.