У овом упутству ћете научити о различитим битним операцијама у Свифту. Они се користе за израчунавање нивоа бита у изразу.
Бит се користи за означавање бинарне цифре. Бинарна цифра може имати две могуће вредности или 0 или 1. Као програмер почетничког нивоа, не морате радити са операцијама на нивоу бита.
Довољан је рад са примитивним типовима података као што су: интегер, флоат, боолеан, стринг итд. Можда ћете морати да радите на нивоу бита када се бавите програмирањем на ниском нивоу.
Свифт пружа богат скуп оператора, осим основних оператора, за манипулисање битовима. Ови оператори су слични логичким операторима, осим што раде на бинарним приказима података (битова).
Битовни оператори су оператори који се користе за промену појединачних битова операнда. Операнд је променљива или константа у којој се врши операција.
Сви битни оператори доступни у брзом доносу наведени су у наставку:
1. Битни НЕ Оператор
Представљен је ~
знаком тилде и може се применити на један операнд. Ово обрће све битове. односно промене 1 на 0 и 0 на 1.
Ако је к променљива / константа која садржи бинарну вредност, тј. 0 или 1. Битна не-операција к променљиве може бити представљена у доњој табели:
НЕИкс | ~ к |
---|---|
0 | 1 |
1 | 0 |
Пример 1: Битни НЕ оператор за непотписани цели број
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Када покренете горњи програм, излаз ће бити:
254
У горе наведеном програму, изјава let initalNumber:UInt8 = 1
је типа Унсигнед инт величине 8 бита. Дакле, 1 у децималном облику може се представити као 00000001
у бинарном.
Оператор бит-а не мења сав бит променљиве или константе, бит 0 се мења у 1 и 1 у 0. Дакле, инвертедНумбер садржи битове 11111110
. Након претварања у децимални приказ представљен је као 254. Дакле, израз print(invertedNumber)
даје 254 на екрану.
Такође можете извршити битни оператор директно у битовима као:
Пример 2: Битни НЕ оператор у битовима
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
Када покренете горњи програм, излаз ће бити:
0
ИнитиалБитс садржи бинарну вредност 11111111
која одговара 255 у децималном облику . За представљање броја у бинарном 0b
облику имамо префикс у литерали. Без 0b
префикса, третираће га као нормалан цео број и добићете грешку преливања (УИнт8 може да ускладишти бројеве од само 0 до 255).
Пошто смо користили битни не оператор, он мења свих 1 на 0. Дакле, константа инвертедБитс садржи 00000000
што је еквивалентно 0 у UInt8
.
Пример 3: Битни НЕ оператор за потписани цели број
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Када покренете горњи програм, излаз ће бити:
-2
У горњем програму, 1 у децималном облику може се представити као 00000001
у бинарном. Оператор бит-а не мења сав бит променљиве или константе, бит 0 се мења у 1 и 1 у 0. Дакле, инвертедНумбер садржи битове 11111110
. Ово би требало да прикаже 254 на екрану. Али уместо тога враћа -2. Чудно, зар не ?? Истражимо у наставку како се то догодило.
let initalNumber:Int = 1
је потписани инт који може садржавати и позитивне и негативне цијеле бројеве. Због тога када смо пријавили не оператор за потписани цели број, враћени бинарни систем такође може представљати негативан број.
Како је компајлер протумачио -2 као 11111110
у бинарном?
Компајлер је користио Тво-ов комплемент за представљање целих бројева. Да бисте добили комплементарни негативни запис целог броја, прво бисте требали записати број у бинарном облику, а затим обрнути цифре и додати један резултату.
Кораци за откривање два комплемента -2 :
- Напишите 2 у бинарном облику:
00000010
- Обрни цифре. 0 постаје 1 и 1 постаје 0:
11111101
- Додај 1:
11111110
Тако преводилац тумачи бинарни број 1111110
као -2
децимални. Али, постоји мали заокрет који је компајлер направио, а који нисмо приметили. Такође је закључио тип обрнутог броја као Int8
тип.
Да бисмо ово разумели, погледајмо пример испод:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
Када покренете горњи програм, излаз ће бити:
-2 254
У горњем примеру, компајлер је третирао бинарни број на -2 у децималном облику само за Потписани 8-битни цели број. Стога изјава print(Int8(bitPattern: 0b11111110))
на екрану даје -2.
Али за нормални целобројни тип чија је величина 32/64 бит и може да садржи велике вредности, он тумачи вредност као 254
. Стога, изјава print(0b11111110)
излази 254 на екрану.
2. Битни И Оператор
Представљен је &
и може се применити на два операнда. Оператор АНД упоређује два бита и враћа 1 ако су оба бита 1, у супротном враћа 0.
Ако су к и и променљиве / константе које садрже бинарну вредност, тј. 0 или 1. Битна операција АНД на к и и може бити представљена у доњој табели:
ИИкс | г. | к & и |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
Пример 5: Битни рад И
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)
Када покренете горњи програм, излаз ће бити:
Бинарни: 10000011 131
У горе наведеном програму, изјава let result = xBits & yBits
комбинује битове два операнда кБитс и иБитс. Враћа 1, оба бита су 1, иначе 0.
String(value , radix: )
иницијализатор се користи за представљање броја у различитим бројевним системима. Ако доставимо вредност радикса 2. То претвара број у бинарни систем бројева. Слично томе, можемо користити 16 за хексадецимално и 10 за децимално.
Изјава на екрану print("Binary:",String(result, radix: 2))
даје Бинари: 10000011 . 10000011
је еквивалентно 131 у децималном облику, израз print(result)
даје 131 у конзоли.
3. Битни ИЛИ оператор
Представљен је као |
и може се применити на два операнда. Битни ИЛИ оператор упоређује два бита и генерише резултат 1 ако је један или више његових улаза 1, иначе 0.
Ако су к и и променљиве / константе које садрже бинарну вредност, тј. 0 или 1. Операција у битовима ИЛИ на к и и може бити представљена у доњој табели:
ИЛИИкс | г. | к | г. |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
Пример 6: Операција у битовима ИЛИ
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
Када покренете горњи програм, излаз ће бити:
Бинарни: 11111111 255
У горе наведеном програму, изјава let result = xBits | yBits
комбинује битове две константе кБитс и иБитс. Враћа 1 ако је било који од битова 1, иначе враћа 0.
Изјава на екрану print("Binary:",String(result, radix: 2))
даје Бинарни: 11111111 . Будући да 11111111
је еквивалент 255
децималном, израз на екрану print(result)
излази 255 .
4. Битни КСОР оператор
Представљен је као ^
и може се применити на два операнда. КСОР оператор упоређује два бита и генерише резултат 1 ако је тачно један од његових улаза 1, иначе враћа 0.
Ако су к и и променљиве / константе које садрже бинарну вредност, тј. 0 или 1. Битносна КСОР операција на к и и може бити представљена у доњој табели:
КСОРИкс | г. | к и |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
Пример 7: Битни КСОР рад
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result)
Када покренете горњи програм, излаз ће бити:
Бинарни: 1111100 124
У горе наведеном програму, изјава let result = xBits yBits
комбинује битове две константе кБитс и иБитс. Враћа 1 ако је тачно један од битова 1, иначе враћа 0.
Изјава на екрану print("Binary:",String(result, radix: 2))
даје Бинарни: 1111100 (еквивалентно 01111100). Будући да 1111100
је еквивалентно 124
децималном, изјава на екрану print(result)
избацује 124 .
5. Оператор померања у битовима
Ови оператори се користе за померање свих битова броја улево или удесно за одређени број места и могу се применити на један операнд. Представљен је као <<
или >>
.
Постоје две врсте оператора смене:
Битни леви оператер смене
- Означено као
<<
- Узрокује померање битова улево, одређено бројем иза којег следи
<<
. - Положаји битова који су напуштени операцијом смјене су попуњени нулом.
- Померање битова целог броја улево за једну позицију удвостручује његову вредност
Пример 8: Оператор помака у леву смеру
let someBits:UInt8 = 0b11000100 print(someBits << 1)
Када покренете горњи програм, излаз ће бити:
136
У горе наведеном програму користили смо оператора леве смене. Коришћење <<
1 значи померање бита за 1 улево. Цифре се померају улево за један положај, а последња цифра удесно попуњава се нулом.
Такође можете видети да се губи цифра која се помера „са краја“ са леве стране. Не заокупља се поново са десне стране. Померањем једног бита улево уклања се 1 из бинарног система и додаје 0 у десно да би се попунила померена вредност, а остатак осталих битова померен је у леву позицију за 1.
Ово се враћа 10001000
што је еквивалентно 136
ин UInt8
. Према томе, print(someBits << 1)
изјава на екрану приказује 136 .
Оператор брзине удесно
- Означено као
>>
- Узрокује померање битова удесно за бројем иза којег следи
>>
- За непотписане бројеве, положаји битова који су напуштени операцијом смјене су попуњени нулом.
- За потписане бројеве (бројеве који такође могу бити негативни), знаковни бит се користи за попуњавање празних позиција битова. Другим речима, ако је број позитиван, користи се 0, а ако је број негативан, користи се 1.
- Померање удесно за један положај преполовљује његову вредност.
Пример 9: Оператор битног помака удесно за непотписани цели број
let someBits: UInt8 = 4 print(someBits>> 1)
Када покренете горњи програм, излаз ће бити:
2
У горе наведеном програму користили смо оператора десног помака на непотписаном целом броју. Коришћење >>
1 значи померање бита за 1 удесно. Положаји битова који су напуштени операцијом смјене увијек су попуњени нулом на непотписаном цијелом броју.
Пошто је 4 представљено као 00000100
у бинарном. Померајући га за један бит удесно, враћа се 00000010
што је еквивалентно 2
ин UInt8
. Према томе, print(someBits>> 1)
изјава на екрану приказује 2.
Пример 10: Оператор битног помака удесно за потписани цели број
let someBits:Int = -4 print(someBits>> 1)
Када покренете горњи програм, излаз ће бити:
-2
У горе наведеном програму користили смо оператора десног помака на непотписаном целом броју. За разлику од позитивних бројева, употреба >>
за негативне бројеве користи се 1 за попуњавање упражњеног места, уместо 0.
Синце, -4
је представљен као 11111100
у бинарном. Померањем једног бита удесно и постављањем 1 на упражњено место, враћа 11111110
се еквивалент -2
за Int8
тип. Стога print(someBits>> 1)
изјава на екрану даје излаз -2.