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.

Dvojková a šestnáctková: proč se píše 0xFF a ne 255

Soustava není vlastnost čísla. Číslo je to samé; mění se jen zápis. Dvě stě padesát pět je 255, 0xFF i 1111 1111 — tři způsoby, jak napsat jednu věc, a hádka o to, který je „správný“, je hádka o to, který je zrovna čitelnější.

hodnota = Σ cifrai · základilibovolná poziční soustava

Šestnáctková není další soustava — je to zkratka pro dvojkovou

To je celý důvod, proč ji vidíte všude. Jedna šestnáctková číslice je přesně čtyři bity, protože 16 = 2⁴. Převod se tedy nepočítá, jen se čte po čtveřicích:

1101 0110₂  →  D 6  →  0xD6čtyři bity na číslici

Zkuste totéž s desítkovou: 1101 0110₂ je 214, a mezi „214“ a těmi bity není žádný vztah, který by se dal přečíst očima. Proto je adresa v paměti šestnáctkově, proto je maska šestnáctkově a proto je barva #FF8C00 a ne rgb(255,140,0), když jde o bajty.

Osmičková je z téže rodiny (tři bity na číslici) a přežívá hlavně v unixových právech: chmod 755 je devět bitů rozdělených po třech — vlastník, skupina, ostatní — a každá trojice je čtení, zápis, spuštění.

Prefixy, a jedna past

zápissoustavaodkud
0x16C, a odtud skoro všude
0b2C++14, Python, Rust, novější C
0o8Python 3, JS — starší jazyky měly jen 0, což byl zdroj chyb

Past, na kterou jsem narazil při psaní téhle labky (chytil ji test kruhem, ne oko): šestnáctkový řetězec může začínat znaky, které vypadají jako dvojkový prefix. 0b1f je docela obyčejné číslo 2847 — a parser, který uvidí „0b“ a začne číst dvojkově, na tom havaruje. Prefix je prefix jen tehdy, když nemůže být daty; když je soustava zadaná zvenčí, platí jen ten prefix, který k ní patří.

Vzorce v této kapitole

poz. — poziční zápis
x = Σ dᵢ · bⁱ [—] kap. 2
hex — jedna hex číslice = 4 bity
16 = 2⁴ [—] kap. 2