tanszek:oktatas:szamitastechnika:binaris_muveletek
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| tanszek:oktatas:szamitastechnika:binaris_muveletek [2024/10/08 19:10] – [2. OR művelet] knehez | tanszek:oktatas:szamitastechnika:binaris_muveletek [2026/09/29 18:00] (current) – [Gyakorlati példa: Bitek beállítása és törlése] knehez | ||
|---|---|---|---|
| Line 3: | Line 3: | ||
| A bináris logikai műveletek (**AND**, **OR**, **XOR**) fontos szerepet játszanak a bitek kezelésében, | A bináris logikai műveletek (**AND**, **OR**, **XOR**) fontos szerepet játszanak a bitek kezelésében, | ||
| - | ==== 1. AND művelet ==== | + | ==== 1. AND (és) művelet ==== |
| Az **AND** művelet csak akkor ad 1-es eredményt, ha mindkét bemenet 1. A bitek " | Az **AND** művelet csak akkor ad 1-es eredményt, ha mindkét bemenet 1. A bitek " | ||
| Line 52: | Line 52: | ||
| ==== 3. XOR művelet ==== | ==== 3. XOR művelet ==== | ||
| Az **XOR** (kizáró vagy) művelet akkor ad 1-et, ha a bemenetek eltérnek. Ezzel biteket kapcsolgathatunk, | Az **XOR** (kizáró vagy) művelet akkor ad 1-et, ha a bemenetek eltérnek. Ezzel biteket kapcsolgathatunk, | ||
| - | * Példa: Ha az alsó 4 bit értékét akarjuk megváltoztatni: | ||
| - | - `10101101 ^ 00001111 = 10100010`. | ||
| - | |||
| - | Ez a művelet különösen hasznos, ha egy adott bitet meg akarunk " | ||
| **Igazságtábla: | **Igazságtábla: | ||
| Line 64: | Line 60: | ||
| | 1 | 0 | 1 | | | 1 | 0 | 1 | | ||
| | 1 | 1 | 0 | | | 1 | 1 | 0 | | ||
| + | |||
| + | **Példa**: Ha az alsó 4 bit értékét akarjuk megfordítani: | ||
| + | < | ||
| + | 10101101 | ||
| + | ^ 00001111 | ||
| + | ---------- | ||
| + | 10100010 | ||
| + | </ | ||
| ==== Gyakorlati példa: Bitek beállítása és törlése ==== | ==== Gyakorlati példa: Bitek beállítása és törlése ==== | ||
| - | Tegyük fel, hogy van egy 8 bites regiszterünk: | + | Tegyük fel, hogy van egy 8 bites regiszterünk: |
| - | - **Egy bit bekapcsolása (pl. 2. bit):** | + | **Egy bit bekapcsolása (pl. 3. bit):** |
| - | | + | |
| - | | + | '' |
| - | | + | |
| - | + | Maszk legyen: '' | |
| - | | + | |
| - | | + | Megjegyzés: |
| - | | + | |
| - | | + | Művelet: |
| - | + | ||
| - | - **Egy bit átkapcsolása (pl. 0. bit):** | + | Eredmény: |
| - | | + | < |
| - | | + | 10101001 |
| - | | + | | 00000100 |
| + | ---------- | ||
| + | | ||
| + | </ | ||
| + | |||
| + | **Egy bit kikapcsolása (pl. 4. bit):** | ||
| + | |||
| + | '' | ||
| + | |||
| + | Maszk legyen: '' | ||
| + | |||
| + | Megjegyzés: | ||
| + | |||
| + | Művelet: | ||
| + | |||
| + | Eredmény: | ||
| + | < | ||
| + | | ||
| + | & 11110111 | ||
| + | ---------- | ||
| + | | ||
| + | </ | ||
| + | |||
| + | === Egy bit átkapcsolása (pl. 0. bit): === | ||
| + | |||
| + | Maszk legyen: '' | ||
| + | |||
| + | Művelet: | ||
| + | |||
| + | Eredmény: | ||
| + | < | ||
| + | | ||
| + | ^ 00000001 | ||
| + | ---------- | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Újra alkalmazva ugyanezt a műveletet az új eredményen '' | ||
| + | |||
| + | < | ||
| + | 10101100 | ||
| + | ^ 00000001 | ||
| + | ---------- | ||
| + | 10101101 | ||
| + | </ | ||
| Az igazságtáblák és a fenti példák segítségével megérthető, | Az igazságtáblák és a fenti példák segítségével megérthető, | ||
| + | |||
| + | === Az XOR fontos tulajdonságai === | ||
| + | |||
| + | Az XOR műveletnek több hasznos tulajdonsága van: | ||
| + | |||
| + | < | ||
| + | A XOR 0 = A | ||
| + | A XOR 1 = NOT A | ||
| + | A XOR A = 0 | ||
| + | (A XOR B) XOR B = A | ||
| + | </ | ||
| + | |||
| + | Ezek jelentése: | ||
| + | |||
| + | * A 0-val végzett XOR nem változtatja meg a bitet. | ||
| + | * Az 1-gyel végzett XOR megfordítja a bitet. | ||
| + | * Egy bit önmagával végzett XOR művelete mindig 0. | ||
| + | * Ha ugyanazzal az értékkel kétszer végzünk XOR műveletet, visszakapjuk az eredeti értéket. | ||
| + | |||
| + | Az utolsó tulajdonság teszi lehetővé, hogy az XOR műveletet egyszerű titkosításra is használjuk. | ||
| + | |||
| + | === Két bináris érték különbségének megkeresése === | ||
| + | |||
| + | Az XOR segítségével könnyen megállapítható, | ||
| + | |||
| + | Legyen a két érték: | ||
| + | |||
| + | < | ||
| + | 10101101 | ||
| + | ^ 10000111 | ||
| + | ---------- | ||
| + | 00101010 | ||
| + | </ | ||
| + | |||
| + | Az eredményben ott található 1-es, ahol a két eredeti érték bitjei különböznek. A fenti példában a két szám három bitpozícióban tér el egymástól. | ||
| + | |||
| + | Ez például két hardverregiszter, | ||
| + | |||
| + | === Egyszerű titkosítás XOR művelettel === | ||
| + | |||
| + | Legyen az üzenetet tartalmazó bájt: | ||
| + | |||
| + | < | ||
| + | Üzenet: 01000001 | ||
| + | Kulcs: | ||
| + | </ | ||
| + | |||
| + | Az üzenet titkosításához XOR műveletet végzünk: | ||
| + | |||
| + | < | ||
| + | 01000001 | ||
| + | ^ 00110110 | ||
| + | ---------- | ||
| + | 01110111 | ||
| + | </ | ||
| + | |||
| + | A titkosított adat visszafejtéséhez ugyanazt a kulcsot ismét alkalmazzuk: | ||
| + | |||
| + | < | ||
| + | 01110111 | ||
| + | ^ 00110110 | ||
| + | ---------- | ||
| + | 01000001 | ||
| + | </ | ||
| + | |||
| + | Ez azért működik, mert: | ||
| + | |||
| + | < | ||
| + | (Üzenet XOR Kulcs) XOR Kulcs = Üzenet | ||
| + | </ | ||
| + | |||
| + | A kulcs kétszeri alkalmazása megszünteti annak hatását, mivel: | ||
| + | |||
| + | < | ||
| + | Kulcs XOR Kulcs = 0 | ||
| + | </ | ||
| + | |||
| + | és: | ||
| + | |||
| + | < | ||
| + | Üzenet XOR 0 = Üzenet | ||
| + | </ | ||
| + | |||
| + | === Szöveg titkosítása XOR művelettel === | ||
| + | |||
| + | A számítógép a szöveg karaktereit is számokként tárolja. Például az '' | ||
| + | |||
| + | < | ||
| + | A = 65 = 01000001 | ||
| + | </ | ||
| + | |||
| + | Ha a titkosítási kulcs értéke 54: | ||
| + | |||
| + | < | ||
| + | Kulcs = 54 = 00110110 | ||
| + | </ | ||
| + | |||
| + | akkor a titkosított bájt: | ||
| + | |||
| + | < | ||
| + | 01000001 | ||
| + | ^ 00110110 | ||
| + | ---------- | ||
| + | 01110111 | ||
| + | </ | ||
| + | |||
| + | A visszafejtéskor ugyanezt a kulcsot használjuk: | ||
| + | |||
| + | < | ||
| + | 01110111 | ||
| + | ^ 00110110 | ||
| + | ---------- | ||
| + | 01000001 | ||
| + | </ | ||
| + | |||
| + | Egy programban az eljárás elvi formája: | ||
| + | |||
| + | <code c> | ||
| + | titkositott_adat = eredeti_adat ^ kulcs; | ||
| + | visszafejtett_adat = titkositott_adat ^ kulcs; | ||
| + | </ | ||
| + | |||
| + | Fontos, hogy az XOR művelet önmagában nem garantál biztonságos titkosítást. Ha rövid vagy könnyen kitalálható kulcsot használunk, | ||
| + | |||
| + | === One-time pad titkosítás === | ||
| + | |||
| + | Az XOR-ra épülő különleges titkosítási módszer a //one-time pad//, magyarul egyszer használatos kulcs. | ||
| + | |||
| + | A módszer akkor tekinthető tökéletesen biztonságosnak, | ||
| + | |||
| + | * a kulcs valóban véletlenszerű; | ||
| + | * a kulcs legalább olyan hosszú, mint az üzenet; | ||
| + | * a kulcsot titokban tartják; | ||
| + | * ugyanazt a kulcsot csak egyszer használják fel. | ||
| + | |||
| + | A titkosítás: | ||
| + | |||
| + | < | ||
| + | Titkosított üzenet = Üzenet XOR Kulcs | ||
| + | </ | ||
| + | |||
| + | A visszafejtés: | ||
| + | |||
| + | < | ||
| + | Üzenet = Titkosított üzenet XOR Kulcs | ||
| + | </ | ||
| + | |||
| + | A gyakorlatban az egyszer használatos kulcs biztonságos továbbítása és tárolása nehéz, ezért a modern titkosítási eljárások általában nem közvetlenül ezt a módszert használják. A folyamtitkosítók azonban hasonló elven működnek: egy kulcsból előállított kulcsfolyamot XOR művelettel kapcsolnak össze az üzenettel. | ||
| + | |||
| + | === Egyszerű XOR-titkosítás programban === | ||
| + | |||
| + | Az alábbi C program minden karaktert ugyanazzal a kulccsal alakít át: | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | char szoveg[] = " | ||
| + | char kulcs = 42; | ||
| + | |||
| + | for (int i = 0; szoveg[i] != ' | ||
| + | { | ||
| + | szoveg[i] = szoveg[i] ^ kulcs; | ||
| + | } | ||
| + | |||
| + | printf(" | ||
| + | |||
| + | for (int i = 0; szoveg[i] != ' | ||
| + | { | ||
| + | printf(" | ||
| + | } | ||
| + | |||
| + | for (int i = 0; szoveg[i] != ' | ||
| + | { | ||
| + | szoveg[i] = szoveg[i] ^ kulcs; | ||
| + | } | ||
| + | |||
| + | printf(" | ||
| + | |||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | A titkosított adatot hexadecimális számokként jelenítjük meg, mert az XOR művelet eredményeként nem nyomtatható karakterek is keletkezhetnek. | ||
| + | |||
| + | Ez a program csak az XOR működését szemlélteti. Valódi adatok védelmére nem biztonságos, | ||
| + | |||
| + | === Két változó értékének felcserélése XOR művelettel === | ||
| + | |||
| + | Érdekességként két egész szám értéke ideiglenes változó nélkül is felcserélhető: | ||
| + | |||
| + | <code c> | ||
| + | a = a ^ b; | ||
| + | b = a ^ b; | ||
| + | a = a ^ b; | ||
| + | </ | ||
| + | |||
| + | Például legyen: | ||
| + | |||
| + | < | ||
| + | a = 5 | ||
| + | b = 3 | ||
| + | </ | ||
| + | |||
| + | Binárisan: | ||
| + | |||
| + | < | ||
| + | a = 0101 | ||
| + | b = 0011 | ||
| + | </ | ||
| + | |||
| + | A műveletek: | ||
| + | |||
| + | < | ||
| + | a = 0101 XOR 0011 = 0110 | ||
| + | b = 0110 XOR 0011 = 0101 | ||
| + | a = 0110 XOR 0101 = 0011 | ||
| + | </ | ||
| + | |||
| + | Az eredmény: | ||
| + | |||
| + | < | ||
| + | a = 3 | ||
| + | b = 5 | ||
| + | </ | ||
| + | |||
| + | A modern programokban azonban általában jobb ideiglenes változót vagy beépített felcserélő műveletet használni, mert az érthetőbb és kevésbé hibalehetőséges. | ||
| + | |||
| + | === Ellenőrzőérték és paritás számítása === | ||
| + | |||
| + | Az XOR művelet egyszerű hibafelismerésre is használható. Több adatbájt XOR műveletével egy ellenőrzőérték képezhető: | ||
| + | |||
| + | < | ||
| + | ellenorzoertek = adat1 XOR adat2 XOR adat3 | ||
| + | </ | ||
| + | |||
| + | Ha valamelyik adatbit megváltozik, | ||
tanszek/oktatas/szamitastechnika/binaris_muveletek.1728414617.txt.gz · Last modified: by knehez
