A Crystal bitenkénti operátorokkal teszi lehetővé, hogy az Int értékeket bináris szinten manipuláld.
A Crystalben eltoló operátorok segítségével tolhatod a biteket balra (<<) vagy jobbra (>>).
<<)A balra eltoló operátor (<<) a biteket balra tolja.
Az eltolni kívánt értéket a bal oldalon, az eltolás mértékét pedig a jobb oldalon adod meg.
0b0010 << 1
# => 0b0100
0b0010 << 2
# => 0b1000
Ha a szám negatív, akkor az operátor helyette jobbra tol.
0b0010 << -1
# => 0b0001
>>)A jobbra eltoló operátor (>>) a biteket jobbra tolja.
A balra eltoló operátorhoz hasonlóan az eltolni kívánt értéket a bal oldalon, az eltolás mértékét pedig a jobb oldalon adod meg.
0b0100 >> 1
# => 0b0010
0b0100 >> 2
# => 0b0001
És hasonlóképpen, ha a szám negatív, akkor az operátor balra tol.
0b0100 >> -1
# => 0b1000
A Crystalben 3 bináris operátor (&, |, ^) és egy ~ operátor áll rendelkezésre a bitenkénti műveletek elvégzéséhez.
&)A bináris ÉS operátor (&) két értéken végez bitenkénti ÉS műveletet.
Az első érték minden bitjét összehasonlítja a második érték azonos pozíciójában lévő bittel.
Az eredmény bitje 1 lesz, ha mindkét bit 1.
Ellenkező esetben 0 lesz.
0b0011 & 0b1010
# => 0b0010
|)A bináris VAGY operátor (|) két értéken végez bitenkénti VAGY műveletet.
Ez is összehasonlítja az első érték minden bitjét a második érték azonos pozíciójában lévő bittel.
Ha valamelyik bit 1, akkor az eredmény bitje 1 lesz.
Ellenkező esetben 0 lesz.
0b0011 | 0b1010
# => 0b1011
^)A bináris XOR operátor (^) bitenkénti XOR műveletet végez.
A bitenkénti ÉS és bitenkénti VAGY operátorhoz hasonlóan összehasonlítja az első érték minden bitjét a második érték azonos pozíciójában lévő bittel.
Ha közülük csak az egyik 1, akkor az eredmény bitje 1 lesz.
Ellenkező esetben 0.
0b0011 ^ 0b1010
# => 0b1001
~)Végül a bitenkénti NEM operátor (~) megfordítja az érték minden bitjét.
A többi bináris operátortól eltérően ez egy unáris operátor, amely csak a jobb oldali értéken működik.
~0b1110_0010
# => 0b0001_1101
A barátod nemrég küldött neked egy üzenetet egy fontos titokkal. Mivel nem akarta, hogy mások könnyen elolvashassák, az üzenetet egy sor bitmanipulációval titkosította. Írnod kell egy programot, amely segít visszafejteni az üzenetet.
A visszafejtés első lépése, hogy a titkosítás során végzett eltolást visszavonjuk, mégpedig úgy, hogy a biteket visszatoljuk balra. Az eltolás mértéke üzenetenként változhat.
Valósítsd meg a Secrets.shift_back metódust, amely egy értéket és a balra eltolás mértékét kapja.
Secrets.shift_back(0b0001, 2)
# => 0b0100
A következő lépés egy bitmaszk alkalmazása, amellyel bizonyos bitek értékét nyerhetjük ki. A maszkot úgy alkalmazzuk, hogy bitenkénti AND műveletet végzünk az érték és a maszk között.
Valósítsd meg a Secrets.apply_mask metódust, amely egy értéket kap, és alkalmaz rá egy maszkot.
Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100
A bitek balra tolása néhány új 0 bitet hozott létre. Ezek közül néhányat 1-re kell állítani. A bitenkénti OR hasznos arra, hogy bizonyos biteket 1-re állítsunk, a többit pedig változatlanul hagyjuk.
Valósítsd meg a Secrets.set_bits metódust, amely két értéket kap, és bitenkénti OR műveletet végez rajtuk.
Secrets.set_bits(0b0110, 0b0101)
# => 0b111
A titkosítási folyamat részeként a rendszer egy megbeszélt értékkel végez XOR műveletet. Hogy visszajuss az eredeti értékhez, a titkosított értéken egyszerűen újra el kell végezni a XOR műveletet ugyanezzel a megbeszélt értékkel. Egy félreértés miatt azonban a barátod megfordította a megbeszélt érték bitjeit (azaz bitenkénti NOT műveletet alkalmazott a megbeszélt értékre), mielőtt a XOR-t elvégezte.
Valósítsd meg a Secrets.reverse_xor metódust, amely a titkosított és a megbeszélt értéket kapja, és kiszámítja az eredeti értéket.
Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Crystal nyelvet 26 fogalom142 feladat segítségével, valódi emberi mentorálással, mindez ingyen.