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ó:
NEM| x | ~ 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 = 1Unsigned int típusú, 8 bit méretű. Tehát 1 tizedesjegyben ábrázolható, mint 00000001biná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 0belőtagként szerepelünk a literálban. 0bElő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 000000000-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 00000001biná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 = 1egy 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, 1111110mint -2tizedesjegyet. 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ó:
ÉS| x | 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 & yBitské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. 10000011egyené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ó:
VAGY| x | 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 | yBitské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 11111111egyenértékű 255decimá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ó:
XOR| x | 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 yBitské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 1111100egyenértékű 124decimá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 10001000amely egyenértékű 136a 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 00000100a bináris. Ha egy kicsit jobbra tolja, akkor visszatér, 00000010ami egyenértékű az 2in é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 -4van ábrázolva 11111100. Ha egy kicsit jobbra tolja, és 1-et üres pozícióba helyez, akkor 11111110ez visszatér -2a Int8típushoz. Ezért az print(someBits>> 1)utasítás -2-t ad ki a képernyőn.








