Selles õpetuses saate teada Swifti erinevatest bitipõhistest toimingutest. Neid kasutatakse avaldise bititaseme arvutamiseks.
Binaararvu tähistamiseks kasutatakse natuke. Binaararvul võib olla kaks võimalikku väärtust: 0 või 1. Algaja taseme programmeerijana ei pea te töötama bititasemel toimingutega.
Piisab töötamisest selliste primitiivsete andmetüüpidega nagu: täisarv, ujuk, tõeväärtus, string jne. Kui tegelete madala taseme programmeerimisega, peate võib-olla töötama bititasemel.
Swift pakub bittidega manipuleerimiseks rikkalikku operaatorite komplekti, välja arvatud põhioperaatorid. Need operaatorid on sarnased loogiliste operaatoritega, välja arvatud see, et nad töötavad andmete (bittide) binaarsete esituste kallal.
Bitipõhised operaatorid on operaatorid, mida kasutatakse operandi üksikute bitide muutmiseks. Operand on muutuja või konstant, milles operatsioon tehakse.
Kõik kiirelt saadaval olevad bitipõhised operaatorid on loetletud allpool:
1. Bitipidi EI operaator
Seda tähistab tildimärk ~
ja seda saab rakendada ühel operandil. See pöörab kõik bitid ümber. st muudab 1 väärtuseks 0 ja 0 väärtuseks 1.
Kui x on muutuja / konstant, mis hoiab binaarset väärtust, st 0 või 1. Muutuja x toimimist bitipidi ei saa esitada järgmises tabelis:
MITTEx | ~ x |
---|---|
0 | 1 |
1 | 0 |
Näide 1: allkirjastamata täisarvu operaator bititi EI
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Ülaltoodud programmi käivitamisel on väljund:
254
Ülalolevas programmis on avaldus let initalNumber:UInt8 = 1
8-bitise suurusega Unsigned int. Niisiis, 1 kümnendkohas saab esitada nagu 00000001
kahendarv.
Operaator bitipõhiselt mitte muudab kogu muutuja või konstandi bitti, bitt 0 muudetakse väärtuseks 1 ja 1 väärtuseks 0. Niisiis sisaldab invertedNumber bitti 11111110
. Pärast teisendamist kümnendkohaks on seda tähistatud kui 254. Seega väljendab avaldus print(invertedNumber)
ekraanil 254.
Samuti saate bitipidi operaatorit teha otse bitidena:
Näide 2: bittide kaupa operaator EI
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
Ülaltoodud programmi käivitamisel on väljund:
0
initialBits sisaldab binaarset väärtust, 11111111
mis vastab kümnendkohale 255. Binaararvu tähistamiseks on meil 0b
eesliide sõna otseses tähenduses. Ilma 0b
eesliiteta käsitleb see seda tavalise täisarvuna ja kuvatakse ülevoolu tõrge (UInt8 saab salvestada numbreid ainult 0 kuni 255).
Kuna oleme kasutanud bitipõhiselt mitte operaatorit, muudab see kõik 1 väärtuseks 0. Niisiis sisaldab konstant invertedBits, 00000000
mis on võrdne 0-ga UInt8
.
Näide 3: Allkirjastatud täisarvu operaator bititi EI
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Ülaltoodud programmi käivitamisel on väljund:
-2
Ülaltoodud programmis saab kümnendkoha täpsusega 1 esitada 00000001
kahendarvuna. Operaator bitipõhiselt mitte muudab kogu muutuja või konstandi bitti, bitt 0 muudetakse väärtuseks 1 ja 1 väärtuseks 0. Niisiis, invertedNumber sisaldab bitte 11111110
. See peaks ekraanil väljastama 254. Kuid selle asemel tagastab -2. Imelik, eks? Uurime allpool, kuidas see juhtus.
let initalNumber:Int = 1
on signeeritud int, mis mahutab nii positiivseid kui ka negatiivseid täisarvusid. Sellepärast, kui allkirjastatud täisarvu puhul ei kasutanud operaatorit, võib tagastatud binaarkaart tähendada ka negatiivset arvu.
Kuidas tõlgendas kompilaator -2 nagu 11111110
binaarne?
Koostaja kasutas täisarvude tähistamiseks Kaks täiendit. Nende kahe komplementaarvandmete negatiivse täisarvu märkimise saamiseks peate kõigepealt kirjutama numbri välja binaarses vormis, pöörama arvud ümber ja lisama tulemusele ühe.
Sammud teada Täiendkood -2 :
- Kirjutage 2 binaarsel kujul:
00000010
- Pöörake numbrid ümber. 0 saab 1 ja 1 saab 0:
11111101
- Lisage 1:
11111110
See, kuidas kompilaator tõlgendab kahendarvu 1111110
nagu -2
kümnendsüsteemis. Kuid kompilaator tegi väikese väände, mida me ei märganud. Samuti järeldas see tüübina invertedNumber Int8
.
Selle mõistmiseks vaatame allpool toodud näidet:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
Ülaltoodud programmi käivitamisel on väljund:
-2 254
Ülaltoodud näites käsitles kompilaator kahendarvu kümnendkohaga kümnendkohaga ainult allkirjastatud 8-bitise täisarvu korral. Seetõttu print(Int8(bitPattern: 0b11111110))
väljastab avaldus ekraanil -2.
Kuid tavalise täisarvu tüübi puhul, mille suurus on 32/64 bitti ja mahutab suuri väärtusi, tõlgendab see väärtust järgmiselt 254
. Seetõttu print(0b11111110)
väljastab avaldus ekraanil 254 .
2. Piki ja operaatorit
Seda esindavad &
kaks operandit ja seda saab rakendada. Operaator AND võrdleb kahte bitti ja tagastab 1, kui mõlemad bitid on 1, vastasel juhul tagastab 0.
Kui x ja y on muutuja / konstant, siis on binaarväärtus, st 0 või 1. Operatsiooni x ja y bitipõhine JA saab esitada järgmises tabelis:
JAx | y | x & y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
Näide 5: toimimine bitipidi JA
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)
Ülaltoodud programmi käivitamisel on väljund:
Binaarne: 10000011 131
Ülaltoodud programmis let result = xBits & yBits
ühendab avaldus kahe operandi xBits ja yBits bitid. See tagastab 1, mõlemad bitid on 1, vastasel juhul tagastab 0.
String(value , radix: )
initsiaatorit kasutatakse numbri esitamiseks erinevas numbrisüsteemis. Kui esitame radiksiväärtuse 2. See teisendab arvu binaararvusüsteemiks. Samamoodi võime kasutada 16 heksade jaoks ja 10 kümnendkohtade jaoks.
Avaldus print("Binary:",String(result, radix: 2))
väljastab ekraanile Binary: 10000011 . 10000011
on samaväärne kümnendkohaga 131, print(result)
väljund väljendab konsoolis 131.
3. Bitipõhine VÕI operaator
Seda on kujutatud kui |
seda saab rakendada kahel operandil. Bittide kaupa OR-operaator võrdleb kahte bitti ja genereerib tulemuse 1, kui üks või mitu selle sisendit on 1, vastasel juhul 0.
Kui x ja y on muutuvad / konstandid, on kahendväärtus, st 0 või 1. Bittide kaupa OR-i toiminguid x ja y saab esitada järgmises tabelis:
VÕIx | y | x | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
Näide 6: toiming bitipidi VÕI
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
Ülaltoodud programmi käivitamisel on väljund:
Binaarne: 11111111 255
Ülaltoodud programmis let result = xBits | yBits
ühendab avaldus kahe konstandi xBits ja yBits bitid. See tagastab 1, kui mõni bittidest on 1, vastasel juhul tagastab 0.
Avaldus print("Binary:",String(result, radix: 2))
väljastab ekraanile Binary: 11111111 . Kuna 11111111
on samaväärne 255
kümnendsüsteemis, avaldus print(result)
väljastab 255 ekraanile.
4. Operaator Bitwise XOR
Seda on kujutatud kui ^
seda saab rakendada kahel operandil. Operaator XOR võrdleb kahte bitti ja genereerib tulemuse 1, kui täpselt üks selle sisenditest on 1, vastasel juhul tagastab ta 0.
Kui x ja y on muutuvad / konstandid, on kahendväärtus, st 0 või 1. Bittide XOR-i toimingu x-l ja y-l saab esitada järgmises tabelis:
XORx | y | x y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
Näide 7: toiming bitipidi XOR
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result)
Ülaltoodud programmi käivitamisel on väljund:
Binaarne: 1111100 124
Ülaltoodud programmis let result = xBits yBits
ühendab avaldus kahe konstandi xBits ja yBits bitid. See tagastab 1, kui täpselt üks bittidest on 1, vastasel juhul tagastab 0.
Avaldus print("Binary:",String(result, radix: 2))
väljastab ekraanile Binary: 1111100 (vastab 01111100-le). Kuna 1111100
on samaväärne 124
kümnendsüsteemis, avaldus print(result)
väljastab 124 ekraanile.
5. Nuppude kaupa vahetuse operaator
Neid operaatoreid kasutatakse kõigi arvu bitide liigutamiseks teatud arvu kohtade võrra vasakule või paremale ning neid saab rakendada ühel operandil. Seda tähistatakse kui <<
või >>
.
Vahetuskäitlejaid on kahte tüüpi:
Pikk vasakpoolse vahetuse operaator
- Tähistatakse kui
<<
- See põhjustab bittide nihutamist vasakule, millele järgneb number
<<
. - Nihutamise käigus vabanenud bitipositsioonid on nulliga täidetud.
- Terve arvu bittide nihutamine vasakule ühe positsiooni võrra kahekordistab selle väärtust
Näide 8: vasakpoolse vahetuse operaator bititi
let someBits:UInt8 = 0b11000100 print(someBits << 1)
Ülaltoodud programmi käivitamisel on väljund:
136
Ülaltoodud programmis oleme kasutanud vasakpoolse vahetuse operaatorit. <<
1 kasutamine tähendab biti nihutamist 1 võrra vasakule. Numbrid nihutatakse ühe positsiooni võrra vasakule ja viimane paremal olev number täidetakse nulliga.
Samuti näete, et vasakpoolsest otsast nihkunud number on kadunud. See ei kipu uuesti paremalt ümber. Selle ühe bitiga vasakule nihutamine eemaldab binaararvust 1 ja lisab paremale 0, et täita nihutatud väärtus, samuti ülejäänud ülejäänud bitid nihutatakse vasakpoolsesse asendisse 1 võrra.
See tulu 10001000
, mis on samaväärne 136
sisse UInt8
. Seetõttu print(someBits << 1)
väljastab avaldus ekraanil 136 .
Parempoolse vahetuse operaator
- Tähistatakse kui
>>
- See põhjustab bittide nihutamise paremale numbriga, millele järgneb
>>
- Allkirjastamata numbrite korral on nihutamise käigus vabanenud bitipositsioonid nulliga täidetud.
- Allkirjastatud numbrite (numbrid, mis võivad olla ka negatiivsed) korral kasutatakse vabanenud bitipositsioonide täitmiseks märgibitti. Teisisõnu, kui arv on positiivne, kasutatakse 0 ja kui number on negatiivne, kasutatakse 1.
- Ühe positsiooni võrra paremale nihutades selle väärtus väheneb poole võrra.
Näide 9: Parempoolse nihke operaator allkirjastamata täisarvu jaoks
let someBits: UInt8 = 4 print(someBits>> 1)
Ülaltoodud programmi käivitamisel on väljund:
2
Ülaltoodud programmis oleme kirjutanud täisarvule parempoolse nihke operaatori. >>
1 kasutamine tähendab biti nihutamist 1 võrra paremale. Nihutamise käigus vabanenud bittide positsioonid täidetakse alati nulliga täisarvul.
Kuna 4 on kujutatud nagu 00000100
binaarne. Nihutades seda natuke paremale, tagastatakse väärtus, 00000010
mis on samaväärne väärtusega 2
in UInt8
. Seetõttu print(someBits>> 1)
väljastab avaldus ekraanil 2.
Näide 10: Parempoolse nihke operaator allkirjastatud täisarvu jaoks
let someBits:Int = -4 print(someBits>> 1)
Ülaltoodud programmi käivitamisel on väljund:
-2
Ülaltoodud programmis oleme kirjutanud täisarvule parempoolse nihke operaatori. Erinevalt positiivsetest numbritest kasutatakse >>
negatiivsete arvude jaoks vaba koha täitmiseks 0 asemel 0.
Kuna, -4
on esindatud nagu 11111100
kahendkoodis. Suunates üks natuke paremale ja asetades 1 vabale ametikohale, naaseb 11111110
mis on samaväärne -2
jaoks Int8
tüüp. Seetõttu print(someBits>> 1)
väljastab avaldus ekraanil -2.