Swift Bitwise og Bit Shift Operators (med eksempler)

I denne opplæringen lærer du om forskjellige bitvise operasjoner i Swift. Disse brukes til bitnivåberegning i et uttrykk.

Litt brukes til å betegne et binært siffer. Et binært siffer kan ha to mulige verdier enten 0 eller 1. Som nybegynnernivåprogrammerer trenger du ikke å jobbe med operasjoner på bitnivå.

Å jobbe med primitive datatyper som: heltall, float, boolsk, streng osv. Er nok. Du må kanskje jobbe på bitnivå når du har å gjøre med programmering på lavt nivå.

Swift tilbyr et rikt sett med operatører, bortsett fra grunnleggende operatører, for å manipulere biter. Disse operatorene ligner på de logiske operatorene, bortsett fra at de jobber med binære representasjoner av data (bits).

Bitvise operatorer er operatorer som brukes til å endre individuelle biter i en operand. Operand er en variabel eller konstant der operasjonen utføres.

Alle bitvise operatører som er tilgjengelige raskt, er oppført nedenfor:

1. Bitvis IKKE operatør

Den er representert med tilde- ~skilt og kan brukes på en enkelt operand. Dette inverterer alle biter. dvs. endrer 1 til 0 og 0 til 1.

Hvis x er en variabel / konstant som har binær verdi, dvs. 0 eller 1. Den bitvise ikke-operasjonen på x-variabelen kan vises i tabellen nedenfor:

IKKE
x ~ x
0 1
1 0

Eksempel 1: Bitvis IKKE operator for usignert heltall

 let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber) 

Når du kjører programmet ovenfor, vil utdataene være:

 254

I det ovennevnte programmet er utsagnet let initalNumber:UInt8 = 1av typen Unsignert int av størrelse 8 bits. Så, 1 i desimal kan representeres som 00000001i binær.

Den bitvise ikke-operatoren endrer hele biten av en variabel eller konstant, bit 0 endres til 1 og 1 til 0. Så invertedNumber inneholder bits 11111110. Etter å ha konvertert den til desimal, blir den representert som 254. Så utsagnet print(invertedNumber)sender ut 254 på skjermen.

Du kan også utføre bitvis operatør direkte i bitene som:

Eksempel 2: Bitvis IKKE operatør i bits

 let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits) 

Når du kjører programmet ovenfor, vil utdataene være:

 0

initialBits inneholder binær verdi 11111111som tilsvarer 255 i desimal. For å representere tallet i binær har vi 0bsom et prefiks i bokstavelig. Uten 0bsom et prefiks, vil det behandle det som et vanlig heltall, og du vil få en overflowfeil (UInt8 kan lagre tall fra bare 0 til 255).

Siden vi har brukt bitvis ikke operatør, endrer den hele 1 til 0. Så, konstant invertedBits inneholder 00000000som tilsvarer 0 in UInt8.

Eksempel 3: Bitvis IKKE operator for signert heltall

 let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber) 

Når du kjører programmet ovenfor, vil utdataene være:

 -2

I programmet ovenfor kan 1 i desimal vises som 00000001i binær. Den bitvise ikke-operatøren endrer hele biten av en variabel eller konstant, bit 0 endres til 1 og 1 til 0. Så invertedNumber inneholder bits 11111110. Dette skal sende ut 254 på skjermen. Men i stedet returnerer -2. Merkelig, ikke sant? La oss undersøke nedenfor hvordan dette skjedde.

let initalNumber:Int = 1er en signert int som kan inneholde både positive og negative heltall. Derfor, når vi ikke brukte operator for et signert heltall, kan det returnerte binæret også representere et negativt tall.

Hvordan tolket kompilatoren -2 som 11111110 i binær?

Kompilatoren brukte komplementet til Two for å representere heltall. For å få de to komplement-negative notasjonene av et heltall, bør du først skrive ut tallet i binær, deretter invertere sifrene, og legge til ett i resultatet.

Fremgangsmåte for å finne ut To's komplement på -2 :

  1. Skriv 2 i binær form: 00000010
  2. Snu sifrene. 0 blir 1 og 1 blir 0:11111101
  3. Legg til 1: 11111110

Slik tolker kompilator binært tall 1111110som -2i desimal. Men det er en liten vri som kompilatoren gjorde som vi ikke la merke til. Det utledet også typen invertert nummer som Int8type.

For å forstå dette, la oss se et eksempel nedenfor:

 print(Int8(bitPattern: 0b11111110)) print(0b11111110)

Når du kjører programmet ovenfor, vil utdataene være:

 -2 254

I eksemplet ovenfor behandlet kompilatoren det binære tallet til -2 i desimal bare for det signerte 8-biters heltallet. Derfor utsagn print(Int8(bitPattern: 0b11111110))utgang -2 på skjermen.

Men for den vanlige heltallstypen hvis størrelse er 32/64 bit og kan inneholde store verdier, tolker den verdien som 254. Derfor uttalelse print(0b11111110)utganger 254 i skjermen.

2. Bitvis OG operatør

Den er representert av &og kan brukes på to operander. AND-operatoren sammenligner to bits og returnerer 1 hvis begge bitene er 1, ellers returnerer 0.

Hvis x og y er variabel / konstant som har binær verdi, dvs. 0 eller 1. Bitvis AND-operasjon på x og y kan vises i tabellen nedenfor:

OG
x y x & y
0 0 0
0 1 0
1 1 1
1 0 0

Eksempel 5: Bitvis OG drift

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)

Når du kjører programmet ovenfor, vil utdataene være:

 Binær: 10000011 131 

I programmet ovenfor let result = xBits & yBitskombinerer uttalelsen biter av to operander xBits og yBits. Den returnerer 1, begge bitene er 1, ellers returnerer den 0.

String(value , radix: )initializer brukes til å representere nummer i forskjellige nummersystemer. Hvis vi gir radiksverdi 2. Det konverterer tallet til binært tallsystem. På samme måte kan vi bruke 16 for heks og 10 for desimal.

Uttalelsen print("Binary:",String(result, radix: 2))utganger Binary: 10000011 i skjermen. 10000011tilsvarer 131 i desimal, utsagnet print(result)utsender 131 i konsollen.

3. Bitvis ELLER operatør

Den er representert som |og kan brukes på to operander. Bitvis ELLER-operatør sammenligner to bits og genererer et resultat på 1 hvis en eller flere av inngangene er 1 ellers 0.

Hvis x og y er variabel / konstant som har binær verdi, dvs. 0 eller 1. Bitvis ELLER-operasjon på x og y kan vises i tabellen nedenfor:

ELLER
x y x | y
0 0 0
0 1 1
1 1 1
1 0 1

Eksempel 6: Bitvis ELLER drift

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result) 

Når du kjører programmet ovenfor, vil utdataene være:

 Binær: 11111111 255 

I programmet ovenfor let result = xBits | yBitskombinerer uttalelsen biter av to konstanter xBits og yBits. Den returnerer 1 hvis noen av bitene er 1, ellers returnerer den 0.

Uttalelsen print("Binary:",String(result, radix: 2))utganger Binary: 11111111 i skjermen. Siden, 11111111tilsvarer 255i desimal, oppstilling print(result)utganger 255 i skjermen.

4. Bitvis XOR-operatør

Den er representert som ^og kan brukes på to operander. XOR-operatøren sammenligner to biter og genererer et resultat på 1 hvis nøyaktig en av inngangene er 1, ellers returnerer den 0.

Hvis x og y er variabel / konstant som har binær verdi, dvs. 0 eller 1. Bitvis XOR-operasjon på x og y kan vises i tabellen nedenfor:

XOR
x y x y
0 0 0
0 1 1
1 1 0
1 0 1

Eksempel 7: Bitvis XOR-drift

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result) 

Når du kjører programmet ovenfor, vil utdataene være:

 Binær: 1111100 124 

I programmet ovenfor let result = xBits yBitskombinerer uttalelsen biter av to konstanter xBits og yBits. Den returnerer 1 hvis akkurat en av bitene er 1, ellers returnerer den 0.

Uttalelsen print("Binary:",String(result, radix: 2))sender ut Binær: 1111100 (tilsvarer 01111100) på skjermen. Siden, 1111100tilsvarer 124i desimal, oppstilling print(result)utganger 124 i skjermen.

5. Bitvis skiftoperatør

Denne operatorene brukes til å flytte alle biter i et tall til venstre eller høyre et bestemt antall steder og kan brukes på en enkelt operand. Det er representert som <<eller >>.

Det er to typer skiftoperatører:

Bitvis venstre skiftoperatør

  • Betegnet som <<
  • Det fører til at bitene forskyves til venstre spesifisert av tallet etterfulgt av <<.
  • Bitposisjonene som er fraflyttet av skiftoperasjonen er nullfylte.
  • Å skifte et heltalls bits til venstre med en posisjon dobler verdien

Eksempel 8: Bitvis venstre skiftoperatør

 let someBits:UInt8 = 0b11000100 print(someBits << 1) 

Når du kjører programmet ovenfor, vil utdataene være:

 136

I programmet ovenfor har vi brukt venstreskiftoperatør. Å bruke <<1 betyr å skifte bit med 1 mot venstre. Sifrene flyttes til venstre med en posisjon, og det siste sifferet til høyre er fylt med null.

Du kan også se sifferet som blir forskjøvet "fra slutten" fra venstre side er tapt. Det brytes ikke om igjen fra høyre. Å skifte den en bit til venstre fjerner 1 fra binæren og legger til 0 i høyre for å fylle den forskyvede verdien, så også resten av de andre bitene forskyves mot venstre posisjon med 1.

Dette returnerer 10001000som tilsvarer 136i UInt8. Derfor gir print(someBits << 1)utsagn 136 ut på skjermen.

Bitvis høyre skiftoperatør

  • Betegnet som >>
  • Det fører til at bitene forskyves til høyre av tallet etterfulgt av >>
  • For usignerte tall er bitposisjonene som er fraflyttet av skiftoperasjonen nullfylt.
  • For signerte tall (tall som også kan være negative), brukes sign-bit til å fylle de ledige bitposisjonene. Med andre ord, hvis tallet er positivt, brukes 0, og hvis tallet er negativt, brukes 1.
  • Hvis du flytter den til høyre med en posisjon, halveres verdien.

Eksempel 9: Bitvis høyre skiftoperatør for usignert heltall

 let someBits: UInt8 = 4 print(someBits>> 1) 

Når du kjører programmet ovenfor, vil utdataene være:

 2

I programmet ovenfor har vi brukt høyre skiftoperatør på et usignert heltall. Å bruke >>1 betyr å skifte biten med 1 mot høyre. Bitposisjonene som er fraflyttet av skiftoperasjonen er alltid nullfylt på et usignert heltall.

Siden er 4 representert som 00000100i binær. Ved å skifte den en bit til høyre, returnerer det 00000010som tilsvarer 2in UInt8. Derfor gir print(someBits>> 1)utsagn 2 på skjermen.

Eksempel 10: Bitvis høyre skiftoperatør for signert heltall

 let someBits:Int = -4 print(someBits>> 1) 

Når du kjører programmet ovenfor, vil utdataene være:

 -2

I programmet ovenfor har vi brukt høyre skiftoperatør på et usignert heltall. I motsetning til positive tall, brukes >>for negative tall, brukes 1 til å fylle det ledige stedet, i stedet for 0.

Siden, -4er representert som 11111100i binær. Å skyve den en bit til høyre og plassere 1 i ledig stilling, returnerer 11111110som tilsvarer -2for Int8type. Derfor gir print(someBits>> 1)utsagn utgang -2 på skjermen.

Interessante artikler...