„Swift Bitwise“ ir „Bit Shift“ operatoriai (su pavyzdžiais)

Š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:

NE
x ~ 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 = 1yra „Unsigned int“ tipo, kurio dydis yra 8 bitai. Taigi, 1 po kablelio gali būti pavaizduotas kaip 00000001dvejetainis.

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 0bpažodį pažodžiui. Be 0bprefikso 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 00000000tai, 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 00000001dvejetainis. 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 = 1yra 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ą :

  1. Parašykite 2 dvejetainiu pavidalu: 00000010
  2. Apverskite skaitmenis. 0 tampa 1, o 1 tampa 0:11111101
  3. Pridėti 1: 11111110

Taip kompiliatorius interpretuoja dvejetainį skaičių 1111110kaip -2dešimtainį. Tačiau kompiliatorius padarė šiek tiek pasukimo, kurio mes nepastebėjome. Tai taip pat padarė išvadą apie invertedNumber Int8tipą.

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“:

IR
x 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 & yBitssujungia 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. 10000011yra 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“.

ARBA
x 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 | yBitssujungia 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, 11111111yra lygi 255deš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:

XOR
x 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 yBitssujungia 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, 1111100yra lygi 124deš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 10001000kuris yra lygiavertis 136per 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 00000100dvejetainis. Perkėlus vieną bitą į dešinę, grąžinama, 00000010kuri prilygsta „ 2in“ 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, -4vaizduojamas kaip 11111100dvejetainis. Perkeliant ją viena tiek į dešinę ir pateikimo 1 iš laisvos pozicijos, grįžta 11111110, kuris yra lygiavertis -2Int8tipo. Todėl print(someBits>> 1)pareiškimas ekrane pateikia -2.

Įdomios straipsniai...