Šioje pamokoje sužinosite apie įvairias „Swift“ operacijas bitais. Jie naudojami skaičiuojant bitų lygį išraiškoje.
Dvejetainiui skaitmeniui žymėti naudojamas šiek tiek. Dvejetainis skaitmuo gali turėti dvi galimas reikšmes: 0 arba 1. Kaip pradedančiųjų lygio programuotojui, jums nereikia dirbti su bitų lygmens operacijomis.
Pakanka dirbti su primityviais duomenų tipais, tokiais kaip: sveikasis skaičius, „float“, „Boolean“, eilutė ir kt. Jums gali tekti dirbti bitų lygiu, kai turite reikalų su žemo lygio programavimu.
„Swift“ suteikia daugybę operatorių, išskyrus pagrindinius operatorius, kad galėtų manipuliuoti bitais. Šie operatoriai yra panašūs į loginius operatorius, išskyrus tai, kad jie dirba dvejetainiais duomenų (bitų) vaizdais.
Operatoriai bitais yra operatoriai, naudojami keičiant atskirus operando bitus. Operandas yra kintamasis arba pastovus, kuriame atliekama operacija.
Visi greitaeigiai bitų operatoriai yra išvardyti žemiau:
1. Bitų režimu NE operatorius
Jį vaizduoja tildės ~
ženklas ir jis gali būti pritaikytas vienam operandui. Tai apvers visus bitus. ty pakeičia 1 į 0 ir 0 į 1.
Jei x yra kintamasis / konstanta, turinti dvejetainę vertę, ty 0 arba 1. Kintamojo x neveikimas bitų pavidalu gali būti pateiktas toliau pateiktoje lentelėje:
NEx | ~ x |
---|---|
0 | 1 |
1 | 0 |
1 pavyzdys: nepasirašyto sveiko skaičiaus operatorius NEBŪTINIS
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Kai paleisite pirmiau nurodytą programą, išvestis bus:
254
Pirmiau pateiktoje programoje teiginys let initalNumber:UInt8 = 1
yra „Unsigned int“ tipo, kurio dydis yra 8 bitai. Taigi, 1 po kablelio gali būti pavaizduotas kaip 00000001
dvejetainis.
Operatorius „bitai ne“ keičia visus kintamojo ar konstantos bitus, bitas 0 pakeičiamas į 1 ir 1 į 0. Taigi „invertedNumber“ yra bitų 11111110
. Perskaičiavus ją po dešimtainio skaičiaus, jis parodomas kaip 254. Taigi, sakinys print(invertedNumber)
ekrane pateikia 254.
Taip pat galite atlikti bitų operaciją tiesiai bitais kaip:
2 pavyzdys: operatorius bitais NE bitais
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
Kai paleisite pirmiau nurodytą programą, išvestis bus:
0
„initialBits“ yra dvejetainė reikšmė 11111111
, atitinkanti 255 po kablelio. Norėdami atstovauti skaičių dvejetainiais skaičiais, turime 0b
pažodį pažodžiui. Be 0b
prefikso jis bus traktuojamas kaip įprastas sveikasis skaičius ir gausite perpildymo klaidą (UInt8 gali saugoti skaičius tik nuo 0 iki 255).
Kadangi mes naudojome bitų, o ne operatorių, jis pakeičia visus 1 į 0. Taigi, konstanta invertedBits yra 00000000
tai, kas lygi 0 in UInt8
.
3 pavyzdys: pasirašyto sveikojo skaičiaus operatorius NĖRA bitais
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Kai paleisite pirmiau nurodytą programą, išvestis bus:
-2
Pirmiau pateiktoje programoje 1 dešimtainiu skaičiumi gali būti pavaizduotas kaip 00000001
dvejetainis. Operatorius „bitai ne“ keičia visus kintamojo ar konstantos bitus, bitas 0 pakeičiamas į 1 ir 1 į 0. Taigi, „invertedNumber“ yra bitai 11111110
. Tai turėtų rodyti 254 ekrane. Bet vietoj to grįžta -2. Keista, tiesa ?? Toliau panagrinėkime, kaip tai įvyko.
let initalNumber:Int = 1
yra pasirašytas int, kuriame gali būti teigiami ir neigiami sveiki skaičiai. Štai kodėl, kai pasirašytam sveikam skaičiui taikėme ne operatorių, grąžintas dvejetainis skaičius taip pat gali būti neigiamas skaičius.
Kaip kompiliatorius interpretavo -2 kaip 11111110
dvejetainį?
Kompiliatorius naudojo „Two“ komplementą sveikiems skaičiams pateikti. Norėdami gauti dviejų papildų neigiamą sveikojo skaičiaus žymėjimą, pirmiausia turėtumėte užrašyti skaičių dvejetainiu skaičiumi, tada apversti skaičius ir pridėti prie rezultato.
Veiksmai, norint išsiaiškinti dviejų -2 papildymą :
- Parašykite 2 dvejetainiu pavidalu:
00000010
- Apverskite skaitmenis. 0 tampa 1, o 1 tampa 0:
11111101
- Pridėti 1:
11111110
Taip kompiliatorius interpretuoja dvejetainį skaičių 1111110
kaip -2
dešimtainį. Tačiau kompiliatorius padarė šiek tiek pasukimo, kurio mes nepastebėjome. Tai taip pat padarė išvadą apie invertedNumber Int8
tipą.
Norėdami tai suprasti, pažiūrėkime toliau pateiktą pavyzdį:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
Kai paleisite pirmiau nurodytą programą, išvestis bus:
-2 254
Pirmiau pateiktame pavyzdyje kompiliatorius dvejetainį skaičių iki dešimtainio skaičiaus apdorojo tik pasirašytam 8 bitų skaičiui. Todėl pareiškimas print(Int8(bitPattern: 0b11111110))
ekrane pateikia -2.
Tačiau įprasto sveikojo skaičiaus tipui, kurio dydis yra 32/64 bitų ir gali talpinti dideles reikšmes, reikšmė aiškinama kaip 254
. Todėl teiginys print(0b11111110)
išveda 254 ekrane.
2. Bitais IR Operatorius
Jį vaizduoja &
du operandai ir jis gali būti pritaikytas. Operatorius AND palygina du bitus ir grąžina 1, jei abu bitai yra 1, kitaip grąžina 0.
Jei x ir y yra kintamieji / pastovieji, jie turi dvejetainę vertę, ty 0 arba 1. Toliau pateiktoje lentelėje galima pateikti x ir y operaciją „Bitai IR“:
IRx | y | x & y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
5 pavyzdys: Veikimas pagal bitą IR
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)
Kai paleisite pirmiau nurodytą programą, išvestis bus:
Dvejetainis: 10000011 131
Aukščiau pateiktoje programoje teiginys let result = xBits & yBits
sujungia dviejų operandų xBits ir yBits bitus. Jis grąžina 1, abu bitai yra 1, kitaip jis grąžina 0.
String(value , radix: )
inicializatorius naudojamas skaičiui atvaizduoti skirtingoje skaičių sistemoje. Jei mes pateikiame radikso reikšmę 2. Ji konvertuoja skaičių į dvejetainių skaičių sistemą. Panašiai galime naudoti 16 šešioliktainiams ir 10 dešimtainiams.
Pareiškime print("Binary:",String(result, radix: 2))
išėjimai Binary: 10000011 ekrane. 10000011
yra lygiavertis 131 po kablelio, teiginys print(result)
konsole pateikia 131.
3. Operatorius, veikiantis bitais
Jis vaizduojamas kaip |
ir gali būti pritaikytas dviem operandams. Operatorius bitais OR palygina du bitus ir sukuria rezultatą 1, jei vienas ar daugiau jo įėjimų yra 1, kitaip 0.
Jei x ir y yra kintamieji / pastovieji, turintys dvejetainę vertę, ty 0 arba 1. Žemiau esančioje lentelėje galima pateikti x ir y operaciją „Bitai OR“.
ARBAx | y | x | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
6 pavyzdys: operacija bitais ARBA
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
Kai paleisite pirmiau nurodytą programą, išvestis bus:
Dvejetainis: 11111111 255
Ankstesnėje programoje teiginys let result = xBits | yBits
sujungia dviejų konstantų xBits ir yBits bitus. Jis grąžina 1, jei kuris nors iš bitų yra 1, kitaip jis grąžina 0.
Pareiškime print("Binary:",String(result, radix: 2))
išėjimai Binary: 11111111 ekrane. Nes, 11111111
yra lygi 255
dešimtaine, teiginys print(result)
išėjimai 255 ekrane.
4. Operatorius „Bitwise XOR“
Jis vaizduojamas kaip ^
ir gali būti pritaikytas dviem operandams. Operatorius XOR palygina du bitus ir sukuria rezultatą 1, jei tiksliai vienas iš jo įėjimų yra 1, kitaip jis grąžina 0.
Jei x ir y yra kintamieji / pastovieji, jie turi dvejetainę vertę, ty 0 arba 1. Bitų XOR operaciją x ir y galima pateikti toliau pateiktoje lentelėje:
XORx | y | x y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
7 pavyzdys: XOR operacija bitų pavidalu
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result)
Kai paleisite pirmiau nurodytą programą, išvestis bus:
Dvejetainis: 1111100 124
Ankstesnėje programoje teiginys let result = xBits yBits
sujungia dviejų konstantų xBits ir yBits bitus. Jis grąžina 1, jei tiksliai vienas iš bitų yra 1, kitaip jis grąžina 0.
Pareiškime print("Binary:",String(result, radix: 2))
išėjimai Binary: 1111100 (atitinka 01111100) ekrane. Nes, 1111100
yra lygi 124
dešimtaine, teiginys print(result)
išėjimai 124 ekrane.
5. „Bitwise Shift“ operatorius
Šie operatoriai naudojami visiems skaičiaus bitams perkelti į kairę arba į dešinę tam tikru vietų skaičiumi ir gali būti pritaikyti vienam operandui. Tai vaizduojama kaip <<
arba >>
.
Yra dviejų rūšių pamainų operatoriai:
Kairysis kairiosios pamainos operatorius
- Žymima kaip
<<
- Dėl to bitai perkeliami į kairę, nurodytą skaičiumi, po kurio eina
<<
. - Bitų pozicijos, kurios buvo atlaisvintos perjungimo operacijos metu, užpildomos nuliu.
- Perkėlus sveiko skaičiaus bitus į kairę viena pozicija, jo vertė padvigubėja
8 pavyzdys: kairės kairės poslinkio operatorius
let someBits:UInt8 = 0b11000100 print(someBits << 1)
Kai paleisite pirmiau nurodytą programą, išvestis bus:
136
Pirmiau pateiktoje programoje mes naudojome kairės poslinkio operatorių. Naudojant <<
1 reiškia perkelti bitą 1 į kairę. Skaitmenys perkeliami kairėn viena pozicija, o paskutinis skaitmuo dešinėje užpildomas nuliu.
Taip pat galite pamatyti, kad prarastas skaitmuo, kuris pasislenka „iš galo“ iš kairės pusės. Jis vėl nesisuka iš dešinės. Perkėlus vieną bitą į kairę, dvejetainis elementas pašalinamas iš 1 ir dešinėje pridedama 0, kad užpildytumėte perkeltą vertę, o likusieji kiti bitai pasislenka kairiosios padėties link 1.
Šis grįžta 10001000
kuris yra lygiavertis 136
per UInt8
. Todėl print(someBits << 1)
pareiškimas ekrane pateikia 136 .
Dešinės dešinės perjungimo operatorius
- Žymima kaip
>>
- Dėl to bitai pasislenka į dešinę skaičiumi, po kurio eina
>>
- Nepasirašytų skaičių atveju bitų pozicijos, kurios buvo atlaisvintos perjungimo operacijos metu, užpildomos nuliu.
- Pasirašytiems skaičiams (skaičiams, kurie taip pat gali būti neigiami) ženklo bitai naudojami atlaisvintoms bitų pozicijoms užpildyti. Kitaip tariant, jei skaičius yra teigiamas, naudojamas 0, o jei skaičius yra neigiamas, naudojamas 1.
- Perkėlus jį į dešinę viena pozicija, jo vertė perpus sumažėja.
9 pavyzdys: nepasirašyto sveikojo skaičiaus dešinės poslinkio operatorius
let someBits: UInt8 = 4 print(someBits>> 1)
Kai paleisite pirmiau nurodytą programą, išvestis bus:
2
Pirmiau pateiktoje programoje mes naudojome dešiniojo poslinkio operatorių nepasirašytam sveikam skaičiui. Naudojant >>
"1" reiškia pereiti prie šiek tiek 1 į dešinę. Bitų pozicijos, kurios buvo atlaisvintos perkėlimo operacijos metu, visada yra nulis užpildytas nepasirašytu sveikuoju skaičiumi.
Kadangi, 4 pavaizduotas kaip 00000100
dvejetainis. Perkėlus vieną bitą į dešinę, grąžinama, 00000010
kuri prilygsta „ 2
in“ UInt8
. Todėl print(someBits>> 1)
pareiškimas ekrane pateikia 2 išvestį.
10 pavyzdys: pasirašyto sveikojo skaičiaus dešiniojo poslinkio operatorius
let someBits:Int = -4 print(someBits>> 1)
Kai paleisite pirmiau nurodytą programą, išvestis bus:
-2
Pirmiau pateiktoje programoje mes naudojome dešiniojo poslinkio operatorių nepasirašytam sveikam skaičiui. Skirtingai nuo teigiamų skaičių, naudojant >>
neigiamus skaičius, vietoj 0 tuščia vieta užpildoma 1.
Nuo, -4
vaizduojamas kaip 11111100
dvejetainis. Perkeliant ją viena tiek į dešinę ir pateikimo 1 iš laisvos pozicijos, grįžta 11111110
, kuris yra lygiavertis -2
už Int8
tipo. Todėl print(someBits>> 1)
pareiškimas ekrane pateikia -2.