Bitový operátor XOR
Operátor XOR nazývame exkluzívny súčet a je svojou funkcionalitou podobný bitovému/logickému súčtu OR. Narozdiel od OR, ale XOR má nepravdivú hodnotu nielen vtedy, ak oba výroky sú nepravdivé, ale aj vtedy, ak sú oba výroky pravdivé.
Správanie operátora XOR:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
V jazyku C++ píšeme XOR symbolom ^.
1. príklad: Otestovanie operátora XOR
#include <iostream> using namespace std; int main() { cout << "5 ^ 11 = " <<(5 ^ 11)<< "\n"; cout << "10 ^ 9 = " <<(10 ^ 9)<< "\n"; cout << "7 ^ 15 = " <<(7 ^ 15)<< "\n"; return 0; }
Výsledok programu:
5 ^ 11 = 14
10 ^ 9 = 3
7 ^ 15 = 8
Bitový operátor NOT
Bitový operátor NOT má funkciu takú, že každý bit prevedie na inú hodnotu. Inak povedané, ak niečo má hodnotu 1, tak NOT zmení na 0 a platí to aj opačne. Bitový NOT je známy aj pod pojmom bitový doplnok.
Správanie operátora NOT:
NOT 1 = 0
NOT 0 = 1
2. príklad: Testujeme správanie operátora NOT
#include <iostream> using namespace std; int main() { cout << "~11 = " <<(~11)<< "\n"; cout << "~9 = " <<(~9)<< "\n"; cout << "~15 = " <<(~15)<< "\n"; return 0; }
Výsledok programu:
~11 = -12
~9 = -10
~15 = -16
Bitové posuny
Z minulého diela už niečo viete o výrokovej logike. Aj o tom, ako vyzerajú čísla v 4-bitovom a 8-bitovom predvedení. Teraz tieto poznatky zúročíme na bitových posunoch.
Čo je bitový posun? Jedná sa o posun bitov na základe počtu zadaných miest buď doprava alebo doľava. V jazyku C++ ma bitový posun doľava tvár << a bitový posun doprava tvar >>.
Ukážka:
Majme príklad, že 3 << 1. Znamená to, že zoberieme číslo v 8-bitovej reprezentácie a posunieme jednotlivé bity doľava o 1 pozíciu. A tú chýbajúcu pozíciu na pravej strane doplníme o jednu 0.
Takže praktická ukážka:
-
0000 0011 – číslo 3 v 8-bitovej reprezentácii
-
0000 011 – došlo k posunu doľava o jednú pozíciu.
-
0000 0110 – doplnenie chýbajúcej 0 sprava tak, aby sa zachovala 8-bitová reprezentácia!
Takže po posunutí čísla 3 doľava nám vyšlo číslo 6.
Skúsme ešte jeden príklad. Napríklad 4 << 2
-
0000 0100 – číslo 4 v 8-bitovej reprezentácii
-
0001 00 – bitový posun doľava o 2 pozície
-
0001 0000 – doplnenie núl sprava.
Predstavte si šialenejšie čísla ako sme mali doteraz so šialenejšími posunmi. Napríklad 255 << 9. No komu by sa v dnešnom svete chcelo počítať a posúvať ručne a samozrejme sa nezmýliť. Máme našťastie vzorec, ktorý vystihuje bitový posun doľava.
Vzorec:
Nech platí bitový posun doľava n << k, kde číslo n predstavuje číslo, ktoré chceme posunúť a číslo k znamená počet miest, o ktoré chceme číslo n posunúť doľava. Potom platí x*2n. To znamená, že
z príkladu 255 << 9 dosadíme do vzorca 255*29 = 130560.
Bitový posun doprava znamená, že posúvame bity doprava a vľavo pridávame 0.
Majme príklad 16 >> 3.
0001 0000
– číslo 16 v 8-bitovej reprezentácii 0 0010
– bitový posun o tri pozície000
0 0010
– doplnenie núl.
Výsledok je 2.
Vzorec vyjadrujúci bitový posun doprava je x/2n.
3. príklad: Precvičenie bitového posunu doľava a doprava
#include <iostream> using namespace std; int main() { cout << "3 << 1 = " <<(3 << 1)<< "\n"; cout << "6 << 2 = " <<(6 << 2)<< "\n"; cout << "11 << 4 = " <<(11 << 4)<< "\n"; cout << "48 >> 3 = " <<(48 >> 3)<< "\n"; cout << "123 >> 5 = " <<(123 >> 5)<< "\n"; cout << "144 >> 7 = " <<(144 >> 7)<< "\n"; return 0; }
Výsledok programu:
3 << 1 = 6
6 << 2 = 24
11 << 4 = 176
48 >> 3 = 6
123 >> 5 = 3
144 >> 7 = 1
Ternárny operátor
Ternárny operátor ?: alebo ešte známy ako podmienený operátor, súvisí s podmienkami. Ak sa vám nechce zdĺhavo písať if alebo case podmienky, tak ternárny operátor je pre vás ako stvorený. Má to ale háčik resp. obmedzenie. Ternárny operátor je funkcionalitou konštrukcia if else resp. case default. Nie je možné, aby ste z tejto konštrukcie urobili napr. 3 if podmienky.
Takže, máme napríklad vysledok = ((i < 5) ? ++i : --i;
Môj slovný popis, čo sa deje pri odohravaní tohto kódu: Ak hodnota premennej i je menšia ako 5, tak zvýš hodnotu premennej i o +1, inak (zápor alebo už vám známe else) zníž o -1.
4. príklad: Ukážka na ternárny operátor
#include <iostream> using namespace std; int main() { int i = 12; int vysledok = (i < 10) ? ++i : --i; cout << vysledok; return 0; }
Výsledok programu:
11