A bitenkénti műveletekkel a bináris számok egyes számjegyeit tudjuk módosítani.
Az Elm számos bitenkénti operátort kínál a Bitwise moduljában
Egy szám egyes bitjeinek módosítását maszkolásnak nevezzük.
A maszk egy olyan szám, amelyben bizonyos biteket meghatározott módon állítottunk be, hogy bitenkénti operátorokkal, például and, or és xor segítségével módosítsunk egy másik számot.
Az and úgy kombinál két számot, hogy csak azokat a biteket tartja meg, amelyek mindkettőben 1-esek.
Ez hasznos annak ellenőrzésére, hogy egy adott bit be van-e állítva.
Például annak ellenőrzéséhez, hogy egy szám 4. bitje 1-re van-e állítva, végezz and műveletet a 01000 maszkkal (8 tízes számrendszerben), és nézd meg, hogy az eredmény nem nulla-e:
Bitwise.and 13 8 --> 8
-- 13 = 01101
-- 8 = 01000
-- and = 01000 = 8
Az or úgy kombinál két számot, hogy minden bitet 1-re állít, ha az valamelyik vagy mindkét számban 1.
Ez hasznos egy adott bit 1-re állításához.
Például a 10101 2. bitjének beállításához végezz or műveletet a 00010 maszkkal:
Bitwise.or 21 2 --> 23
-- 21 = 10101
-- 2 = 00010
-- or = 10111 = 23
Az xor úgy kombinál két számot, hogy minden bitet 1-re állít, ha az az egyik számban 1, a másikban viszont 0.
Ez hasznos egy bit átbillentésére az ellenkező értékére:
Bitwise.xor 20 5 --> 17
-- 20 = 10100
-- 5 = 00101
-- xor = 10001 = 17
A complement egy szám minden bitjét invertálja (a 0-ból 1 lesz, az 1-ből 0).
Figyeld meg, hogy ennek eredményeként a pozitív számok negatívvá, a negatív számok pedig pozitívvá válnak.
Ennek az az oka, hogy a negatív számokat binárisan a bal szélső helyiértéken 1-essel ábrázolják.
Bitwise.complement 21 --> -22
-- 21 = 00000000000000000000000000010101
-- complement = 11111111111111111111111111101010 = -22
A következő operátorok a biteket egy megadott számú pozícióval balra vagy jobbra mozgatják, ami gyakorlatilag 2 hatványaival való szorzásnak vagy osztásnak felel meg.
A shiftLeftBy balra mozgatja a biteket, jobb oldalról 0-kkal feltöltve.
Például a 21 eltolásához 3 hellyel balra:
Bitwise.shiftLeftBy 3 21 --> 168
-- 21 = 10101
-- shiftLeftBy 3 = 10101000 = 168
Ez ugyanaz, mintha azt mondanánk, hogy 21 * 2^3 = 21 * 2 * 2 * 2 = 168
A shiftRightBy jobbra mozgatja a biteket:
Bitwise.shiftRightBy 2 21 --> 5
-- 21 = 10101
-- shiftRightBy 2 = 00101 = 5
A jobbra eltolás 2 hellyel ugyanaz, mint az egész számok közötti osztás 4-gyel.
Figyeld meg, hogy ez a függvény a bal szélső bitben lévő értéket ismétli meg. Így a negatív számok negatívak maradnak:
Bitwise.shiftRightBy 3 -21 --> -3
-- -21 = 111...101011
-- shiftRightBy 3 = 111...11101 = -3
Ha jobbra szeretnél eltolni és nullákkal feltölteni, használd a shiftRightZfBy-t:
Bitwise.shiftRightZfBy 3 -21 --> 536870909
-- -21 = 111...101011
-- shiftRightZfBy 3 = 00111...11101 = 536870909
A barátod épp most küldött neked egy üzenetet egy fontos titokkal. Hogy ne legyen könnyű másoknak elolvasni, az üzenetet egy sor bitművelettel titkosította. Neked kell megírnod azokat a függvényeket, amelyek segítenek visszafejteni az üzenetet.
A visszafejtés első lépése, hogy a titkosításkor végzett eltolást visszavonjuk, mégpedig úgy, hogy a biteket jobbra toljuk vissza. A visszafejtés későbbi lépései abból indulnak ki, hogy a bal oldalról 0-k kerülnek be.
Valósítsd meg a shiftBack függvényt, amely megkapja az eltolás mértékét és egy értéket, majd végrehajtja az eltolást.
shiftBack 2 42 --> 10
Ezután néhány bitet 1-re kell állítani.
Valósítsd meg a setBits függvényt, amely egy maszkot és egy értéket kap, és visszaadja az eredményt, miután az érték bitjeit 1-re állította. Az érték egy bitjét ott kell 1-re állítani, ahol a maszkban lévő bit is 1. Minden más bit változatlan marad.
setBits 66 212 --> 64
A titkosítás során néhány bit megfordul. Ahhoz, hogy visszafejtsük az üzenetet, ezeket vissza kell fordítani.
Valósítsd meg a flipBits függvényt, amely egy maszkot és egy értéket kap. A maszk jelzi, hogy az érték mely bitjeit kell megfordítani. Ha a maszkban egy bit 1, akkor az értékben az a bit megfordul. Minden más bit változatlan marad.
flipBits 23 157 --> 138
Vannak olyan bitek is, amelyek mindig 0-ra fejtődnek vissza.
Valósítsd meg a clearBits függvényt, amely egy maszkot és egy értéket kap. A value bitjeit ott kell 0-ra állítani, ahol a maszkban a bit 1. Minden más bitet változatlanul kell hagyni.
clearBits 2 15 --> 13
Most, hogy megvan az összes szükséges függvény, visszafejtheted a barátod üzenetét. Valósítsd meg a decrypt függvényt, amely a következő műveleteket hajtja végre:
decrypt 380182 --> 11840
A decrypt függvényt az előző részfeladatokban megvalósított összes függvény felhasználásával írd meg.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Elm nyelvet 28 fogalom110 feladat segítségével, valódi emberi mentorálással, mindez ingyen.