Ebben az oktatóanyagban megismerheti a Swift különböző bitenkénti műveleteit. Ezeket egy kifejezés bitszintű számításához használják.
A bitet bináris számjegy jelölésére használják. A bináris számjegyeknek két lehetséges értéke lehet 0 vagy 1. Kezdő szintű programozóként nem kell bitszintű műveletekkel dolgozni.
Elég olyan primitív adattípusokkal dolgozni, mint: egész szám, float, logikai érték, string stb. Alacsony szintű programozással lehet, hogy bitszinten kell dolgoznia.
A Swift az operátorok kivételével gazdag operátorokat kínál a bitek manipulálására. Ezek az operátorok hasonlóak a logikai operátorokhoz, kivéve, hogy az adatok (bitek) bináris ábrázolásán dolgoznak.
A bitenkénti operátorok olyan operátorok, amelyek az operandus egyes bitjeinek megváltoztatására szolgálnak. Az operandus olyan változó vagy állandó, amelyben a műveletet végezzük.
Az összes böngészőnként elérhető gyors operátor az alábbiakban szerepel:
1. Bitenként NEM kezelő
Tilde ~
jellel ábrázolva, egyetlen operanduson alkalmazható. Ez megfordítja az összes bitet. azaz 1-ről 0-ra és 0-ról 1-re változik.
Ha x olyan változó / konstans, amely bináris értéket tartalmaz, azaz 0 vagy 1. Az x változó bitenként végrehajtott művelete az alábbi táblázatban ábrázolható:
NEMx | ~ x |
---|---|
0 | 1 |
1 | 0 |
1. példa: Bitenként NEM operátor az aláíratlan egész számhoz
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
A fenti program futtatásakor a kimenet a következő lesz:
254
A fenti programban az utasítás let initalNumber:UInt8 = 1
Unsigned int típusú, 8 bit méretű. Tehát 1 tizedesjegyben ábrázolható, mint 00000001
bináris.
A bitenként nem operátor megváltoztatja egy változó vagy konstans összes bitjét, a 0 bit 1-re és 1-re 0-ra változik. Tehát az invertedNumber biteket tartalmaz 11111110
. Miután decimálissá konvertálta, 254-ként ábrázolják. Tehát az utasítás print(invertedNumber)
254-et ad ki a képernyőn.
A bitenkénti operátort közvetlenül a bitekben is végrehajthatja:
2. példa: Bitenként NEM operátor
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
A fenti program futtatásakor a kimenet a következő lesz:
0
Az initialBits bináris értéket tartalmaz 11111111
, amely decimálisban 255-nek felel meg. A szám bináris alakban való ábrázolásához 0b
előtagként szerepelünk a literálban. 0b
Előtag nélkül normál egész számként fogja kezelni, és túlcsordulási hibát kap (az UInt8 csak 0 és 255 közötti számokat képes tárolni).
Mivel bitenként nem operátort használtunk, az összes 1-et 0-ra változtatja. Tehát az invertedBits konstans tartalmaz 00000000
0-nak megfelelő értéket UInt8
.
3. példa: Bitenként NEM operátor az aláírt egész számhoz
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
A fenti program futtatásakor a kimenet a következő lesz:
-2
A fenti programban 1 tizedesjegyben ábrázolható, mint 00000001
bináris. A bitenként nem operátor megváltoztatja a változó vagy konstans összes bitjét, a 0 bit 1-re és 1-re 0-ra változik. Tehát az invertedNumber biteket tartalmaz 11111110
. Ennek 254-et kell kiadnia a képernyőn. De ehelyett -2-t ad vissza. Furcsa, ugye ?? Fedezzük fel alább, hogy történt ez.
let initalNumber:Int = 1
egy előjeles int, amely pozitív és negatív egész számokat egyaránt tartalmazhat. Ezért, amikor nem operátort alkalmaztunk aláírt egész számra, a visszaküldött bináris is negatív számot jelenthet.
Hogyan értelmezte a fordító a -2-t 11111110
binárisként?
A fordító Two-komplementerrel egész számokat ábrázolt. A kettő egészének negatív komplement negatív jelölésének megszerzéséhez először ki kell írnia a számot bináris formában, majd meg kell fordítania a számokat, és hozzá kell adnia egyet az eredményhez.
Lépések a -2-es kettő kiegészítésének megismerésére :
- Írja a 2-et bináris formában:
00000010
- Fordítsa meg a számjegyeket. 0 lesz 1, és 1 0
11111101
- 1:
11111110
Így értelmezi a fordító a bináris számot, 1111110
mint -2
tizedesjegyet. De van egy kis fordulat, amit a fordító tett, amit nem vettünk észre. Arra is következtetett, hogy típusa az invertedNumber Int8
.
Ennek megértéséhez nézzünk meg egy példát alább:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
A fenti program futtatásakor a kimenet a következő lesz:
-2 254
A fenti példában a fordító a bináris számot -2-ig tizedesjegyig kezelte csak az aláírt 8 bites egész számra. Ezért az utasítás print(Int8(bitPattern: 0b11111110))
-2-t ad ki a képernyőn.
De a normál egész típusú típushoz, amelynek mérete 32/64 bites és nagy értékeket képes tárolni, az értéket úgy értelmezi 254
. Ezért az utasítás az 254print(0b11111110)
kimenetet adja ki a képernyőn.
2. Bitenkénti ÉS kezelő
&
Két operandus képviseli és alkalmazható. Az AND operátor összehasonlítja két bitet és 1-et ad vissza, ha mindkét bit 1, különben 0-t ad vissza.
Ha x és y változó / állandó, akkor bináris értéket tart, azaz 0 vagy 1. Az x és y bitenkénti ÉS művelete az alábbi táblázatban ábrázolható:
ÉSx | y | x & y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
5. példa: Bitenkénti ÉS művelet
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)
A fenti program futtatásakor a kimenet a következő lesz:
Bináris: 10000011 131
A fenti programban az utasítás let result = xBits & yBits
két operandus bitjeit egyesíti: xBits és yBits. 1-et ad vissza, mindkét bit 1, különben 0-t ad vissza.
String(value , radix: )
az inicializáló a szám különféle számrendszerben való ábrázolására szolgál. Ha a 2. radix értéket adjuk meg, akkor a számot bináris számrendszerré alakítja. Hasonlóképpen használhatunk 16-ot hexa és 10-et tizedesre.
A nyilatkozat print("Binary:",String(result, radix: 2))
kimenetek Binary: 10000011 a képernyőn. 10000011
egyenértékű tizedesjegyű 131-gyel, az utasítás print(result)
a konzolban adja ki a 131-et.
3. Bitenként VAGY kezelő
|
Két operanduson ábrázolható és alkalmazható. A bitenkénti OR operátor két bitet hasonlít össze és 1 eredményt generál, ha egy vagy több bemenete 1, különben 0.
Ha x és y változó / állandó, akkor bináris érték, azaz 0 vagy 1. Az x és y bitenkénti OR művelete az alábbi táblázatban ábrázolható:
VAGYx | y | x | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
6. példa: Bitenkénti VAGY művelet
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
A fenti program futtatásakor a kimenet a következő lesz:
Bináris: 11111111 255
A fenti programban az utasítás let result = xBits | yBits
két xBits és yBits konstans bitjét egyesíti. 1-et ad vissza, ha bármelyik bit 1, különben 0-t ad vissza.
A nyilatkozat print("Binary:",String(result, radix: 2))
kimenetek Binary: 11111111 a képernyőn. Mivel 11111111
egyenértékű 255
decimális nyilatkozatot print(result)
kiadja 255 a képernyőn.
4. Bitenként XOR operátor
^
Két operanduson ábrázolható és alkalmazható. Az XOR operátor két bitet hasonlít össze és 1 eredményt generál, ha pontosan az egyik bemenete 1, különben 0-t ad vissza.
Ha x és y változó / állandó, akkor bináris érték, azaz 0 vagy 1. Az x és y bitenkénti XOR művelete az alábbi táblázatban látható:
XORx | y | x y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
7. példa: Bitenként XOR művelet
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result)
A fenti program futtatásakor a kimenet a következő lesz:
Bináris: 1111100 124
A fenti programban az utasítás let result = xBits yBits
két xBits és yBits konstans bitjét egyesíti. 1-et ad vissza, ha pontosan az egyik bit 1, különben 0-t ad vissza.
Az utasítás print("Binary:",String(result, radix: 2))
kimeneti bináris: 1111100 (egyenértékű 01111100) a képernyőn. Mivel 1111100
egyenértékű 124
decimális nyilatkozatot print(result)
kiadja a 124 a képernyőn.
5. Bitenkénti váltás kezelője
Ezeket az operátorokat arra használjuk, hogy egy számban lévő összes bitet bizonyos számú helyzettel balra vagy jobbra mozgassunk, és egyetlen operandusra alkalmazhatók. Úgy ábrázolják <<
vagy >>
.
Kétféle műszakvezető létezik:
Bitenkénti bal váltás kezelője
- Jelölése:
<<
- A bitek balra tolódását okozza, amelyet a szám követ
<<
. - Az eltolási művelettel megüresedett bitpozíciók nullával vannak töltve.
- Egy egész bit bitjének balra tolása egy pozícióval megduplázza az értékét
8. példa: Bitenkénti bal váltás operátor
let someBits:UInt8 = 0b11000100 print(someBits << 1)
A fenti program futtatásakor a kimenet a következő lesz:
136
A fenti programban bal váltás operátort használtunk. Az <<
1 használata azt jelenti, hogy a bitet 1-gyel balra toljuk. A számjegyek egy pozícióval balra tolódnak, és a jobb oldali utolsó számjegy nulla lesz.
Láthatja azt a számjegyet is, amely a bal oldalról "a végéről" tolódik el. Jobbról nem tekeredik újra körbe. Ha egy kicsit balra tolja, akkor az 1-et eltávolítja a binárisból, és jobbra 0-t ad hozzá, hogy kitöltse az eltolt értéket, valamint a többi többi bit 1-rel elmozdul a bal helyzet felé.
Ez visszatér 10001000
amely egyenértékű 136
a UInt8
. Ezért az print(someBits << 1)
utasítás a képernyőn 136-ot ad ki.
Bitenkénti jobbra váltás kezelője
- Jelölése:
>>
- Ez azt okozza, hogy a biteket jobbra tolja az utána következő szám
>>
- Aláíratlan számok esetében a váltási művelettel megüresedett bitpozíciók nullával vannak kitöltve.
- Aláírt számok (számok, amelyek szintén lehetnek negatívak) esetén a jelbitet a megüresedett bitpozíciók betöltésére használják. Más szavakkal, ha a szám pozitív, 0-t használunk, és ha a szám negatív, akkor 1-et használunk.
- Ha egy pozícióval jobbra tolja, az értéke felére csökken.
9. példa: Aláíratlan jobbra váltás operátor aláíratlan egész számhoz
let someBits: UInt8 = 4 print(someBits>> 1)
A fenti program futtatásakor a kimenet a következő lesz:
2
A fenti programban jobbra váltás operátort használtunk előjel nélküli egész számra. Az >>
1 használata azt jelenti, hogy a bitet 1-rel jobbra tolja. Az eltolási művelettel megüresedett bitpozíciók mindig nullával vannak kitöltve egy előjel nélküli egész számra.
Mivel a 4 úgy van ábrázolva, mint 00000100
a bináris. Ha egy kicsit jobbra tolja, akkor visszatér, 00000010
ami egyenértékű az 2
in értékkel UInt8
. Ezért az print(someBits>> 1)
utasítás kimenetet jelenít meg a képernyőn.
10. példa: Jobbra tolás operátor bitenként, aláírt egész számhoz
let someBits:Int = -4 print(someBits>> 1)
A fenti program futtatásakor a kimenet a következő lesz:
-2
A fenti programban jobbra váltás operátort használtunk előjel nélküli egész számra. A pozitív számokkal ellentétben, >>
a negatív számoknál 1-et használunk a megüresedett hely betöltésére, 0 helyett.
Mivel a, bináris formában -4
van ábrázolva 11111100
. Ha egy kicsit jobbra tolja, és 1-et üres pozícióba helyez, akkor 11111110
ez visszatér -2
a Int8
típushoz. Ezért az print(someBits>> 1)
utasítás -2-t ad ki a képernyőn.