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

Operatori pe biţi

  • & - ş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;
}

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

  • Există vreo metodă care calculează mai rapid numărul de biţi de 1 dintr-un întreg ? (întrebare interviu - nVidia [2008,

2009])

  • Se poate găsi o metodă de interschimbare a două valori fără o funcţie de swap definită în prealabil ? (pentru exemplul

de la pointeri la funcţii !)

programare-cc/breviar-10.txt · Last modified: 2020/12/11 13:48 by andrei.simescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0