Titkok

Titkok

Tanulófeladat

Bevezetés

A Crystal bitenkénti operátorokkal teszi lehetővé, hogy az Int értékeket bináris szinten manipuláld.

Eltoló operátorok

A Crystalben eltoló operátorok segítségével tolhatod a biteket balra (<<) vagy jobbra (>>).

Balra eltolás(<<)

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

Jobbra eltolás(>>)

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

Bináris operátorok

A Crystalben 3 bináris operátor (&, |, ^) és egy ~ operátor áll rendelkezésre a bitenkénti műveletek elvégzéséhez.

Bitenkénti ÉS(&)

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

Bitenkénti VAGY(|)

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

Bitenkénti XOR(^)

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

Bitenkénti NEM(~)

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

Utasítások

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.

1. Told vissza a biteket

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

2. Alkalmazz bitmaszkot

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

3. Állíts be néhány bitet

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

4. Fordítsd vissza a XOR-t

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)
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Crystal Exercism

Készen állsz elkezdeni a(z) Titkok feladatot?

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.