&
- şi
Ex: 11001100 & 10101010 = 10001000
|
- sau
Ex.: 11001100 | 10101010 = 11101110
^
- sau exclusiv
Ex.: 11001100 ^ 10101010 = 01100110
~
- complement
Ex: ~11001100 = 00110011
«
- deplasare la stânga (înmultire cu 2)
Ex: 0000100 « 2 = 0010000
»
- deplasare la dreapta (împărţire la 2)
Ex: 00001000 » 2 = 00000010
Un exemplu de utilizare a operaţiilor pe biţi pentru diverse funcţionalităţi:
int power_of_two(int x) { if (!x) return 0; return !(x & (x-1)); } /* Functie care intoarce numarul de biti de 1 din reprezentarea * binara a lui x */ int count_bits(int x) { int i; int nrbiti = 0; for (i = 0; i < 32; i++) if ( (1<<i) & x ) nrbiti++; return nrbiti; } /* Functie care intoarce numarul de biti de 1 din reprezentarea * binara a lui x */ int count_bits2(int x) { int nrbiti = 0; while (x) { x = x & (x-1); nrbiti++; } return nrbiti; } int main() { int N; printf("N = "); scanf("%d", &N); printf("%d %s o putere a lui 2.\n", N, power_of_two(N) ? "este": "NU este" ); printf("%d are %d bit(i) de 1 în reprezentarea sa binară.\n", N, count_bits(N)); printf("%d are %d bit(i) de 1 în reprezentarea sa binară.\n", N, count_bits2(N)); return 0; }
Declararea unei variabile de tip pointer la funcţie are următoarea sintaxă:
tip_returnat (*nume_pointer) (lista_argumente)
Exemple de utilizare:
#include <stdio.h> int cmp_cresc(const int x, const int y) { if (x == y) return 0; return x > y ? 1 : -1; } int cmp_desc(const int x, const int y) { if (x == y) return 0; return x > y ? -1 : 1; } void swap(int *x, int *y) { int aux; aux = *x; *x = *y; *y = aux; } void sort(int v[], int n, int (*cmp)(const int x, const int y)) { int i, j; for (i = 0; i < n - 1; i++) for (j = i + 1; j < n; j++) if (cmp(v[i], v[j]) == 1) swap(&v[i], &v[j]); } int main() { int v[100], n, ord; int (*cmps[2])(const int, const int) = {cmp_cresc, cmp_desc}; // citire n si vector .. printf("Alegeti tipul de sortare: 0 - crescator; 1 - descrescator.\n"); scanf("%d", &ord); sort(v, n, cmps[ord]); // afisare vector sortat .. return 0; }
Sunt precedate întotdeauna de # şi se termină la sfârşitul liniei. Pentru a extinde o directivă şi pe linia următoare se
foloseşte \
. Preprocesarea se execută înainte de compilarea efectivă a programului.
Exemple directive de preprocesare: #define
, #include
, #if
, #ifdef
, #else
, #line
, #error
Exemple macrodefiniţii ( #define
):
#include <stdio.h> #define NMAX 100 #define MAX(a, b) ((a) > (b) ? (a) : (b)) int main() { int v[NMAX], n, i, maxim; printf("n = "); scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d", (v + i)); maxim = v[0]; for (i = 1; i < n; i++) maxim = MAX(maxim, v[i]); printf("%d\n", maxim); return 0; }
2009])
de la pointeri la funcţii !)