01: // esempi di operazioni bit a bit
02: #include<stdio.h>
03: #include<stdlib.h>
04:
05: // funzione di appoggio
06: void stampabinario(int);
07:
08: int main(int argc, char **argv){
09:
10: int a;
11: printf("Inserisci un numero intero: ");
12: scanf("%d", &a);
13:
14:
15: printf("Il numero inserito vale: %d (%08x)\n", a, a);
16: printf("In binario vale: ");
17: stampabinario(a);
18: printf("\n\n");
19:
20: int c1 = ~a; // nego bit a bit, quindi gli 1->0 e gli 0->1 e' un complemento a tutti gli effetti
21:
22: printf("Il suo complemento a uno vale: %d (%08x)\n", c1, c1);
23: printf("In binario vale: ");
24: stampabinario(c1);
25: printf("\n\n");
26:
27: int c2 = ~a + 1; // come il precedente ma aggiungo 1 -> complemento a 2
28:
29: printf("Il suo complemento a due vale: %d (%08x)\n", c2, c2);
30: printf("In binario vale: ");
31: stampabinario(c2);
32: printf("\n\n");
33:
34:
35: int b;
36: printf("Quale bit vuoi esaminare? [0,31]");
37: scanf("%d", &b);
38:
39: int bit = (a >> b) & 1 ;
40: // con lo shift di 'b' posizioni porto il bit desiderato in posizione 0
41: // con l'and bit a bit isolo il bit in posizione 0
42:
43: printf("Il bit di indice %d di %d vale %d\n", b, a, bit);
44:
45: return 0;
46: }
47:
48:
49: void stampabinario(int x)
50: {
51: // questa funzione stampa i 32 bit di un int
52: // non conosciamo ancora il controllo di flusso, quindi e' scritta
53: // in maniera non particolarmente elegante
54:
55: // per stampare estraggo i singoli bit portandoli nella posizione meno significativa
56: // mediante shift a destra e poi li isolo con un and bit a bit
57:
58: printf("%d", x >> 31 & 1);
59: printf("%d", x >> 30 & 1);
60: printf("%d", x >> 29 & 1);
61: printf("%d", x >> 28 & 1);
62: printf("%d", x >> 27 & 1);
63: printf("%d", x >> 26 & 1);
64: printf("%d", x >> 25 & 1);
65: printf("%d", x >> 24 & 1);
66: printf(" ");
67: printf("%d", x >> 23 & 1);
68: printf("%d", x >> 22 & 1);
69: printf("%d", x >> 21 & 1);
70: printf("%d", x >> 20 & 1);
71: printf("%d", x >> 19 & 1);
72: printf("%d", x >> 18 & 1);
73: printf("%d", x >> 17 & 1);
74: printf("%d", x >> 16 & 1);
75: printf(" ");
76: printf("%d", x >> 15 & 1);
77: printf("%d", x >> 14 & 1);
78: printf("%d", x >> 13 & 1);
79: printf("%d", x >> 12 & 1);
80: printf("%d", x >> 11 & 1);
81: printf("%d", x >> 10 & 1);
82: printf("%d", x >> 9 & 1);
83: printf("%d", x >> 8 & 1);
84: printf(" ");
85: printf("%d", x >> 7 & 1);
86: printf("%d", x >> 6 & 1);
87: printf("%d", x >> 5 & 1);
88: printf("%d", x >> 4 & 1);
89: printf("%d", x >> 3 & 1);
90: printf("%d", x >> 2 & 1);
91: printf("%d", x >> 1 & 1);
92: printf("%d", x & 1);
93: }
94:
95:
96:
Se avete commenti o osservazioni su questa pagina
mandate un messaggio di posta elettronica a bertoƶƶi@ce.unipr.it
mandate un messaggio di posta elettronica a bertoƶƶi@ce.unipr.it