
Pokud chcete používat logické operátory, musíte vědět něco o tom, jak jsou data uložena v paměti a taky něco o soustavách. Většina z vás to asi zná, vezmu to rychle. Každé číslo (i znak - znak je vlastně jen 8-mi bitové číslo) je uloženo jako jeden (více) bajtů - viz. sizeof(). Každý bajt se skládá z bitů, těch je dnes v jednom bajtu 8. Proto 2 na 8. = 256 (to je ten znak). K těmto jednotlivým bitům se můžeme rychle dostat právě pomocí lobických operátorů. Bylo by dobré vědět, co vlastně jednotlivé bity znamenají. Binární (dvojková), taky šestnáctková (hexadecimální) nebo osmičková (oktálová) a desítková soustava jsou tzv. polynomické soustavy (snad je to slovo správně, nevím jestli to neznamená cosi jinýho :-)). Příkladem nepolynomické je třeba římská soustava číslic. (to čím čísluju i tenhle seriál a co mám zaručeně špatně protže nevím jak spočítat hodnotu) Ale u polytoto soustav jde hodnota spočítat jednoduše. Soustava má tzv. základ (dvojková má 2, desítková 10 ...) Potom jde jakékoliv číslo v takové soustavě vyjádřit pomocí vzorce :To vás asi trochu mate. Prozradíme si že a je ten základ a b je cifra. Cifra má hodnoty od nuly do a - 1. A pokud je nedostatek číslic, použijou se písmeny (hex) No a ten index (u b, mocnina u a) je pořadí oné cifry. Dáme příklad : Tak. Máme hned tři příklady ! První je v desítkové (to se píše do té závorky) Je to číslo 123 (slovy stodvacettři). To se vyjádří jako 1 krát deset na druhou (jednička je na druhém místě) plus 2 krát deset na prvou plus 3 krát deset na nultou. Když to někam hodíte (do kalkulačky či sálového počítadla), vypadne vám výsledek - 123. (dříve či později :-)) Pomocí takové metody se dají vyjádřit i desetinná čísla, i když to se v binární nebo mexadecimální soustavě nepoužívá. Druhý příklad je hex. Je to to samé, jen je potřeba upozornit že když tam bude písmenko, není to chyba. Dáme tabulku :
| Tabulka hexadecimálních čísel | ||
|---|---|---|
| Dekadicky | Binárně | Hexadecimálně |
| 0 | 0000 | 0 |
| 1 | 0001 | 1 |
| 2 | 0010 | 2 |
| 3 | 0011 | 3 |
| 4 | 0100 | 4 |
| 5 | 0101 | 5 |
| 6 | 0110 | 6 |
| 7 | 0111 | 7 |
| 8 | 1000 | 8 |
| 9 | 1001 | 9 |
| 10 | 1010 | A |
| 11 | 1011 | B |
| 12 | 1100 | C |
| 13 | 1101 | D |
| 14 | 1110 | E |
| 15 | 1111 | F |
char a, b, c; a = 1; // Bin. 00000001 b = 0x0B; // Bin. 00001011 c = a & b; // And se píše jedno &, neplést s && // V c bude 1 (= 00000001) |
char a, b, c; a = 3; // Bin. 00000011 b = 5; // Bin. 00000101 c = a | b; // Or se píše jedno |, neplést s || V c bude 7. (= 00000111) |
char a, b, c; a = 3; // Bin. 00000011 b = 5; // Bin. 00000101 c = a ^ b; // Xor se píše ^ // V c bude 6. (= 00000110) |
char a; a = 5; // Bin. 00000101 a = a >> 2; // Posuny jsou šipečky, šlo by a >>= 2; V a bude 1. // 00000001 |
a >>= 4; // 2^4 = 16 -> dělení 16-ti |
char a; a = 5; // Bin. 00000101 a = a << 2; // Posuny jsou šipečky, šlo by a <<= 2; V a bude 20 // 00010100 |
a <<= 3; // 2^3 = 8 -> násobení 8-mi |
a = 1; a = ~a; // taky a ~= a; |
#define PAPRIKA 1
#define SYR 2
#define SUNKA 4
// 1 2 4 8 16 32 64 128 256 ...
int flaga;
flaga = 0;
flaga |= PAPRIKA;
flaga |= SYR;
char str[256];
strcpy(str, "Uzivatel si objednal pizzu s ");
if(flaga & PAPRIKA)
strcat(str, "paprikou, ");
if(flaga & SYR)
strcat(str, "syrem, ");
if(flaga & SUNKA)
strcat(str, "sunkou, ");
strcat(str, "a pitivem.\n");
printf("%s", str);
|