Bitové operace
S bitovými operacemi se pravděpodobně nikdy nesetkáte. Není na škodu ale mít alespoň základní přehled, že něco takového vůbec existuje.
Jazyk C má speciální operátory na práci s bitama. Pro zopakování dvojkové soustavy například zde.
Podporované jsou následující operátory
Operátor | Název | Ukázka |
---|---|---|
~ | bitová negace | ~x |
& | bitový AND | x & y |
| | bitový OR | x | y |
^ | bitový XOR | x ^ y |
<< | bitový posun doleva | x << y |
>> | bitový posun doprava | x >> y |
Mějme dvě dvoubitové čísla
0101 (5 v desítkové soustavě)
1001 (9 v desítkové soustavě)
Bitový AND (5 & 9) funguje tak, že první bit prvního čísla udělá AND operaci s prvním bitem druhého čísla. Pak druhý bit prvního čísla udělá AND s druhým bitem druhého čísla atd.
0101
1001
----
0001 (1 v desítkové soustavě)
Pro náš příklad je výsledek 0001
, protože první bit obou čísel je 1.
Bitový OR (5 | 9) funguje tak, že první bit prvního čísla udělá OR operaci s prvním bitem druhého čísla. Pak druhý bit prvního čísla udělá OR s druhým bitem druhého čísla atd.
0101
1001
----
1101 (13 v desítkové soustavě)
Bitový XOR (5 ^ 9) funguje tak, že první bit prvního čísla udělá XOR operaci s prvním bitem druhého čísla. Pak druhý bit prvního čísla udělá XOR s druhým bitem druhého čísla atd. Pro zopakování XOR funguje tak, že výsledek je 1 právě tehdy, pokud právě jeden z operandů je 1. Pokud jsou oba 0 nebo oba 1, tak je výsledek 0.
0101
1001
----
1100 (12 v desítkové soustavě)
Bitový posun doleva o 2 (9 >> 2) je operace, která posune všechny bity doleva o x (v našem případě o 2). Bity na levém kraji se zahazují.
1001
----
0010 (2 v desítkové soustavě)
Zde se nejdříve provede jeden posun a z 1001
se stane 0100
. Následně se provede druhý posun a z 0100
se stane 0010
.
Bitový posun doprava o 2 (9 << 2) funguje opačně jako bitový posun doleva.
1001
----
100100 (36 v desítkové soustavě)
Zde se nejdříve provede jeden posun a z 1001
se stane 10010
. Následně se provede druhý posun a z 10010
se stane 100100
.
Bitová negace (~5) funguje tak, že se obrátí všechny bity na opačnou hodnotu. Jedná se o unární operátor (pracuje jenom s jednou hodnotou).
0101
----
1010 (10 v desítkové soustavě)
Můžeme si všechny operace ověřit v následujícím programu
#include <stdio.h>
int main() {
printf("5 & 9 je %i\n", 5 & 9);
printf("5 | 9 je %i\n", 5 | 9);
printf("5 ^ 9 je %i\n", 5 ^ 9);
printf("9 >> 2 je %i\n", 9 >> 2);
printf("9 << 2 je %i\n", 9 << 2);
printf("~5 je %i\n", ~5);
return 0;
}
Dostáváme
5 & 9 je 1
5 | 9 je 13
5 ^ 9 je 12
9 >> 2 je 2
9 << 2 je 36
~5 je -6
Jediný rozdíl je v negaci a vyjde nám, že ~5
je -6
. Je to proto, že pokud pracujeme s int
, tak on má 32 bitů (tzv. hodně nul nalevo). Zároveň datový typ int
má v sobě i negativní čísla, což se dělá pomocí dvojkového doplňku. Více informací třeba zde
Můžeme si pomoct, když vytiskneme negaci jako unsigned int
#include <stdio.h>
int main() {
printf("~5 je %u\n", ~5);
return 0;
}
Nyní dostáváme
~5 je 4294967290
Což pro 32 bitů sedí.