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