Table of Contents

Breviar 10 - Pointeri la funcţii. Operatori pe biţi

Operatori pe biţi

Ex: 11001100 & 10101010 = 10001000

Ex.: 11001100 | 10101010 = 11101110

Ex.: 11001100 ^ 10101010 = 01100110

Ex: ~11001100 = 00110011

Ex: 0000100 « 2 = 0010000

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

Pointeri la functii

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

Directive de preprocesare

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

Teme de gandire

2009])

de la pointeri la funcţii !)