BitLab vzorek, který se někdo zeptá

Tohle je statická kopie kapitoly pro vyhledávače. Interaktivní verze má animované obrázky, kontrolní otázky a tlačítka, která příklad načtou do kalkulačky.

Bitové operace: AND, OR, XOR a k čemu doopravdy jsou

Tyhle čtyři operátory pracují na každém bitu zvlášť a nezajímá je, jaké číslo z těch bitů dohromady vyjde. To je celé. Sčítání má přenos z bitu do bitu; tohle ne.

a110011000xCCb101010100xAAAND100010000x88jednička jen tam, kde je v OBOU
Dvě čísla a čtyři operace. Přepínej mezi nimi a sleduj, který sloupec se změní — pravidlo je vidět na jednotlivém sloupci, ne na výsledném čísle.
operacepravidlo na jednom bituna co se používá
a & b AND1 jen když obojíptát se: „je tenhle bit nastavený?“
a | b OR1 když aspoň jednozapínat bity
a ^ b XOR1 když se lišípřepínat, porovnávat, kontrolní součty
a & ~b1 když v a a ne v bvypínat bity

XOR je zvláštní a stojí za vlastní odstavec

Je sám sobě inverzní: x ^ k ^ k = x. To má tři důsledky, které se objevují pořád dokola:

  • Přepínač. x ^= maska obrátí právě ty bity, které jsou v masce. Nepotřebuje vědět, jak byly nastavené předtím.
  • Kontrola. XOR všech bajtů zprávy je nejjednodušší kontrolní součet. Chytí každou lichou chybu v jednom sloupci — a nechytí dvě chyby ve stejném sloupci. Proto existuje CRC, o kterém je celá kapitola v LinkLabu.
  • Šifra, která není šifra. šifra = text ^ klíč se dešifruje tímtéž. Když je klíč opravdu náhodný, dlouhý jako zpráva a použije se jednou, je to jednorázová tabulka a je prokazatelně nerozluštitelná. Když se klíč použije dvakrát, stačí ty dvě zprávy XORovat mezi sebou a klíč zmizí.
x ^ k ^ k = xXOR je sám sobě inverzní

De Morgan

Dvě identity, které platí na každém bitu, a proto na celém slově:

~(a & b) = ~a | ~b     ~(a | b) = ~a & ~bDe Morganovy zákony

Praktický užitek: podmínku „ne (je to A a zároveň B)“ jde přepsat na „není to A nebo není to B“, a druhá varianta jde často vyhodnotit dřív.

Logické a bitové operátory nejsou totéž. V C a v JavaScriptu je && logické „a“, které vyhodnocuje zkráceně a vrací pravdu nebo nepravdu, kdežto & je bitové a vyhodnotí obě strany vždycky. Záměna & za && často „funguje“, protože 1 & 1 je 1 — a rozbije se až ve chvíli, kdy je jedna strana třeba 2, protože 1 & 2 je 0.

Vzorce v této kapitole

XOR — XOR je involuce
x ^ k ^ k = x [—] kap. 5
DM — De Morgan
~(a & b) = ~a | ~b [—] kap. 5