Šajā apmācībā jūs uzzināsit par dažādām ātruma operācijām Swift. Tos izmanto izteiksmes bitu līmeņa aprēķināšanai.
Bitu cipara apzīmēšanai tiek izmantots mazliet. Binārajam ciparam var būt divas iespējamās vērtības: 0 vai 1. Kā iesācēja līmeņa programmētājam jums nav jāstrādā ar operācijām bitu līmenī.
Darbs ar primitīviem datu tipiem, piemēram: vesels skaitlis, pludiņš, būla skaitlis, virkne utt. Jums, iespējams, būs jāstrādā bitu līmenī, kad jums ir darīšana ar zema līmeņa programmēšanu.
Swift nodrošina bagātīgu operatoru kopumu, izņemot pamata operatorus, lai manipulētu ar bitiem. Šie operatori ir līdzīgi loģiskajiem operatoriem, izņemot to, ka tie strādā ar datu (bitu) bināro attēlojumu.
Operatori bitā ir operatori, kurus izmanto, lai mainītu atsevišķus operanda bitus. Operands ir mainīgais vai konstante, kurā tiek veikta darbība.
Visi ātrumā pieejamie bitu ātruma operatori ir uzskaitīti zemāk:
1. Bitwise NAV operators
To attēlo tildes ~
zīme, un to var pielietot vienā operandā. Tas apgriež visus bitus. ti, mainās no 1 uz 0 un 0 uz 1.
Ja x ir mainīgais / konstante, kam ir binārā vērtība, ti, 0 vai 1. Bitu darbību ar mainīgo x nevar attēlot zemāk esošajā tabulā:
NĒx | ~ x |
---|---|
0 | 1 |
1 | 0 |
1. piemērs: Operators Bitwise NOT neparakstītam skaitlim
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Palaidot iepriekš minēto programmu, izeja būs:
254
Iepriekš minētajā programmā paziņojums let initalNumber:UInt8 = 1
ir 8 bitu lieluma Unsigned int tips. Tātad, 1 aiz komata var attēlot tāpat 00000001
kā binārā.
Operators bitu kaupā nemaina visu mainīgā vai konstanta bitu, bits 0 tiek mainīts uz 1 un 1 uz 0. Tātad invertedNumber satur bitus 11111110
. Pēc konvertēšanas decimāldaļā tas tiek attēlots kā 254. Tātad paziņojums print(invertedNumber)
ekrānā izvada 254.
Operatoru bitiem var veikt arī tieši bitos kā:
2. piemērs: Operators bitiem pa bitiem
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
Palaidot iepriekš minēto programmu, izeja būs:
0
initialBits satur bināro vērtību, 11111111
kas atbilst 255 aiz komata. Lai skaitli attēlotu binārā formā, mums 0b
burtnīcā ir prefikss. Bez 0b
prefiksa tas to uzskatīs par normālu veselu skaitli, un jūs saņemsit pārpildes kļūdu (UInt8 var saglabāt skaitļus tikai no 0 līdz 255).
Tā kā mēs izmantojām bitu, nevis operatoru, tas maina visus 1 uz 0. Tātad konstante invertedBits satur, 00000000
kas ir ekvivalents 0 in UInt8
.
3. piemērs: Parakstītā veselā skaitļa operators BITĀ NAV
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Palaidot iepriekš minēto programmu, izeja būs:
-2
Iepriekš minētajā programmā skaitli 1 aiz komata var attēlot tāpat 00000001
kā binārā formātā. Operators bitu režīmā nemaina visu mainīgā vai konstanta bitu, bits 0 tiek mainīts uz 1 un 1 uz 0. Tātad, invertedNumber satur bitus 11111110
. Tam ekrānā jāizvada 254. Bet tā vietā atgriež -2. Dīvaini, vai ne ?? Tālāk izpētīsim, kā tas notika.
let initalNumber:Int = 1
ir parakstīts int, kurā var būt gan pozitīvi, gan negatīvi veseli skaitļi. Tāpēc, ja parakstītajam skaitlim mēs izmantojām nevis operatoru, atgrieztais binārs var būt arī negatīvs skaitlis.
Kā sastādītājs interpretēja -2 kā 11111110
binārā?
Sastādītājs izmantoja Two papildinājumu, lai attēlotu veselus skaitļus. Lai iegūtu divu papildinājumu negatīvu veselā skaitļa apzīmējumu, vispirms vajadzētu izrakstīt skaitli binārā formā, pēc tam apgriezt ciparus un pievienot vienu rezultātam.
Darbības, lai uzzinātu, kā divi papildina -2 :
- Uzrakstiet 2 binārā formā:
00000010
- Apgrieziet ciparus. 0 kļūst par 1 un 1 kļūst par 0:
11111101
- Pievienot 1:
11111110
Tā kompilators bināro skaitli interpretē 1111110
kā -2
decimāldaļu. Bet kompilators ir izdarījis nelielu vērpjot, kuru mēs nepamanījām. Tas arī secināja invertedNumber Int8
veidu kā tipu.
Lai to saprastu, skatīsim zemāk redzamo piemēru:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
Palaidot iepriekš minēto programmu, izeja būs:
-2 254
Iepriekš minētajā piemērā kompilators bināro skaitli apstrādāja ar -2 ar decimāldaļu tikai parakstītajam 8 bitu skaitlim. Tāpēc paziņojums print(Int8(bitPattern: 0b11111110))
ekrānā izvada -2.
Bet parastā vesela skaitļa tipam, kura lielums ir 32/64 biti un kurā var būt lielas vērtības, tas vērtību interpretē kā 254
. Tāpēc paziņojums ekrānā print(0b11111110)
izvada 254 .
2. Bitwise UN operators
To attēlo &
un to var pielietot divos operandos. Operators AND salīdzina divus bitus un atgriež 1, ja abi biti ir 1, pretējā gadījumā atgriež 0.
Ja x un y ir mainīgi / nemainīgi, kam ir binārā vērtība, ti, 0 vai 1. Operāciju Bitwise AND uz x un y var attēlot zemāk esošajā tabulā:
UNx | y | x & y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
5. piemērs: Darbība pa bitēm UN
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)
Palaidot iepriekš minēto programmu, izeja būs:
Binārais: 10000011 131
Iepriekš minētajā programmā paziņojums let result = xBits & yBits
apvieno divu operandu xBits un yBits bitus. Tas atgriež 1, abi biti ir 1, pretējā gadījumā tas atgriež 0.
String(value , radix: )
inicializators tiek izmantots, lai attēlotu numuru dažādās numuru sistēmās. Ja mēs piegādājam radix vērtību 2. Tas pārvērš skaitli binārā skaitļu sistēmā. Līdzīgi mēs varam izmantot 16 sešstūrim un 10 decimāldaļai.
Paziņojums print("Binary:",String(result, radix: 2))
izejas Binary: 10000011 ekrānā. 10000011
ir ekvivalents 131 aiz komata, paziņojums print(result)
konsolē izvada 131.
3. Operators pa bitiem
To attēlo kā |
un to var pielietot divos operandos. BITĀ OR operators salīdzina divus bitus un ģenerē rezultātu 1, ja viena vai vairākas tā ieejas ir 1, citādi 0.
Ja x un y ir mainīgi / nemainīgi, kam ir binārā vērtība, ti, 0 vai 1. Operāciju Bitwise OR uz x un y var attēlot zemāk esošajā tabulā:
VAIx | y | x | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
6. piemērs: operācija pa bitiem vai VAI
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
Palaidot iepriekš minēto programmu, izeja būs:
Binārs: 11111111 255
Iepriekšminētajā programmā paziņojums let result = xBits | yBits
apvieno divu konstantu xBits un yBits bitus. Tas atgriež 1, ja kāds no bitiem ir 1, pretējā gadījumā tas atgriež 0.
Izraksts ekrānā print("Binary:",String(result, radix: 2))
izvada Binary: 11111111 . Tā kā, 11111111
ir ekvivalents 255
decimāldaļām, paziņojums ekrānā print(result)
izvada 255 .
4. Operators Bitwise XOR
To attēlo kā ^
un to var pielietot divos operandos. Operators XOR salīdzina divus bitus un ģenerē rezultātu 1, ja tieši viena no tā ieejām ir 1, pretējā gadījumā tas atgriež 0.
Ja x un y ir mainīgi / nemainīgi, kam ir binārā vērtība, ti, 0 vai 1. Bitu XOR darbību x un y var attēlot zemāk esošajā tabulā:
XORx | y | x y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
7. piemērs: XOR darbība pa bitiem
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result)
Palaidot iepriekš minēto programmu, izeja būs:
Binārais: 1111100 124
Iepriekšminētajā programmā paziņojums let result = xBits yBits
apvieno divu konstantu xBits un yBits bitus. Tas atgriež 1, ja tieši viens no bitiem ir 1, pretējā gadījumā tas atgriež 0.
Paziņojums print("Binary:",String(result, radix: 2))
izejas Binary: 1111100 (ekvivalents 01111100) ekrānā. Tā kā, 1111100
ir ekvivalents 124
decimāldaļām, paziņojums ekrānā print(result)
izvada 124
5. Operators Bitwise Shift
Šie operatori tiek izmantoti, lai visus skaitļa bitus pārvietotu pa kreisi vai pa labi pa noteiktu vietu skaitu, un tos var piemērot vienam operandam. Tas tiek attēlots kā <<
vai >>
.
Ir divu veidu maiņu operatori:
Bitu kustības kreisās maiņas operators
- Tiek apzīmēts kā
<<
- Tas izraisa bitu nobīdi pa kreisi, ko norāda skaitlis, kam seko
<<
. - Bitu pozīcijas, kuras ir atbrīvojušas maiņas operācija, ir piepildītas ar nulli.
- Pārejot vesela skaitļa bitus pa kreisi ar vienu pozīciju, tā vērtība dubultojas
8. piemērs: Bitu kustības kreisās maiņas operators
let someBits:UInt8 = 0b11000100 print(someBits << 1)
Palaidot iepriekš minēto programmu, izeja būs:
136.
Iepriekš minētajā programmā mēs izmantojām kreisās maiņas operatoru. Izmantojot <<
1, bits tiek novirzīts par 1 pa kreisi. Cipari tiek pārvietoti pa kreisi par vienu pozīciju, un pēdējais cipars labajā pusē tiek aizpildīts ar nulli.
Varat arī redzēt, ka tiek pazaudēts cipars, kas tiek nobīdīts "no gala" no kreisās puses. No labās puses tas atkal neaptinās. Pārvietojot to vienu bitu pa kreisi, 1 tiek noņemts no binārā un labajā pusē tiek pievienots 0, lai aizpildītu novirzīto vērtību, kā arī pārējie pārējie biti tiek nobīdīti kreisās pozīcijas virzienā par 1.
Šī atgriežas 10001000
kas ir līdzvērtīgs 136
šajā UInt8
. Tāpēc print(someBits << 1)
paziņojums ekrānā izvada 136 .
Bitu virzienā labās maiņas operators
- Tiek apzīmēts kā
>>
- Tas izraisa bitu nobīdi pa labi ar skaitli, kam seko
>>
- Neparakstītiem skaitļiem bitu pozīcijas, kuras ir atbrīvojušas maiņas operācija, ir piepildītas ar nulli.
- Parakstītajiem numuriem (skaitļiem, kas var būt arī negatīvi) zīmes bits tiek izmantots, lai aizpildītu atbrīvotās bitu pozīcijas. Citiem vārdiem sakot, ja skaitlis ir pozitīvs, tiek izmantots 0, un, ja skaitlis ir negatīvs, tiek izmantots 1.
- Pārvietojot to pa labi par vienu pozīciju, tā vērtība samazinās uz pusi.
9. piemērs: Operatora bitu kustība pa labi neparakstītam skaitlim
let someBits: UInt8 = 4 print(someBits>> 1)
Palaidot iepriekš minēto programmu, izeja būs:
2
Iepriekš minētajā programmā mēs esam izmantojuši labās maiņas operatoru neparakstītam skaitlim. Izmantojot >>
1, bits tiek novirzīts par 1 pa labi. Bitu pozīcijas, kuras ir atbrīvojušas pārvietošanas operācija, vienmēr tiek parakstītas ar nulli uz neparakstīta vesela skaitļa.
Tā kā 4 ir attēlots tāpat 00000100
kā binārā formātā. Novirzot to vienu bitu pa labi, atdevi 00000010
, kas ir līdzvērtīga 2
šajā UInt8
. Tāpēc print(someBits>> 1)
paziņojums ekrānā izvada 2.
10. piemērs: Parakstītais labās puses nobīdes operators parakstītam skaitlim
let someBits:Int = -4 print(someBits>> 1)
Palaidot iepriekš minēto programmu, izeja būs:
-2
Iepriekš minētajā programmā mēs esam izmantojuši labās maiņas operatoru neparakstītam skaitlim. Atšķirībā no pozitīvajiem skaitļiem, izmantojot >>
negatīvos skaitļus, tukšās vietas aizpildīšanai izmanto 1, nevis 0.
Tā kā, -4
tiek attēlots kā 11111100
binārā. Novirzot to viens bits pa labi un ievietojot 1 in vakantā, atdevi 11111110
, kas ir ekvivalents, lai -2
par Int8
tipam. Tāpēc print(someBits>> 1)
paziņojums ekrānā izvada -2.