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); |