Bajt není to nejmenší, s čím lze pracovat ...

Kromě numerických operací (sčítání, dělení ...) lze s čísly provádět i operace bitové. Používají se tyhle operátory:

+================+==========+
| Operace        | Operátor |
+================+==========+
| AND            |  &       |
| OR             |  |       |
| NOT            |  !       |
| komplement     |  ~       |
| XOR            |  ^       |
| rotace doleva  |  <<      |
| rotace doprava |  >>      |
+----------------+----------+


I tyhle operátory lze kombinovat s operátorem přiřazení, takže odstranit nejvyšší bit z byte jde snadno:
a &= 0x7f;

Tím ale ještě podpora jazyka pro práci s bity nekončí.

Bitové položky

Jazyk C nabízí v omezené míře i deklaraci proměnných jejichž velikost definovaná počtem bitů. Technicky se to deklaruje jako struktura jejíž položku jsou typu int případně unsigned int, za názvem proměnné je ale ještě dvojtečka a délka proměnné v bitech. Takže pokud například máme 256ti barevný LCD display kde pro každý znak (náš display umí jen sedmibitové znaky) potřebujeme ještě informaci o barvě v kódování 3:3:2 (po třech bitech na červenou a zelenou, dva bity na modrou) tak pro popis jedné pozice displaye budeme potřebovat toto:

struct s_barva {
unsigned int code : 7;
unsigned int : 1;
unsigned int R : 3;
unsigned int G : 3;
unsigned int B : 2;
} znak;


Nepojmenovaná jednobitová položka ukazuje, že ve struktuře lze některé bity i "přeskočit" - budou vytvořeny, ale protože nemají jméno, nelze se na ně odkázat.

S bitovými položkami pak lze zacházet podobě jako s položkami běžné struktury, takže fialové 'A' už vyrobíme snadno:
znak.R = 7;
znak.G = 0;
znak.B = 3;
znak.code = 'A';


Přeci jen tu ale je řada omezení.
  • Nelze vytvořit ukazatel na položku takové struktury a nelze se ani ptát na velikost jedné položky pomocí sizeof.
  • Není definováno v jakém pořadí budou bity z této definice v paměti uloženy. V naší definici tak nevíme jestli v šestnáctibitovém slovu, které struktura zabírá, je kód znaku v prvním nebo druhém bajtu. Pokud nám na pořadí záleží, nezbývá než zjistit jak to konkrétní překladač dělá a pořadí položek při deklaraci tomu přizpůsobit.
  • Pokud do položky přiřadíme hodnotu, která se "nevejde", uloží se jen ty nejméně významné bity, které se vejdou.
  • Nelze vytvořit bitové pole libovolné délky - oblíbeným maximem je délka jednoho slova na konkrétní platformě.
  • Nelze vytvořit ani indexovatelné pole bitů. Tedy takové, kde byste se pomocí zápisu b[n] odvolali na n-tý bit. Prostě nelze do deklarace struktury napsat unsigned int b[8] : 1;.

Bitové struktury jsou tak nejužitečnější pro úsporu paměti tam, kde potřebujeme uložit větší množství položek z nichž každá je "krátká" a celého bajtu by na ní bylo škoda.