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? ");
37:   scanf("%d", &b);
38: 
39:   int bit = (a >> b) & 1 ; 
40:   // tramite (1<<b) creo un numero che dal punto di vista binario ha un solo '1' nella posizione 'b'.a
41:   // con l'and bit a bit isolo il bit corrispondente di a
42:   // l'ulteriore shift lo riporta nella posizione 'bit meno significativo'
43:   // Semplificando potevo scrivere ((a >> b) & 1)
44: 
45:   printf("Il bit %d di %d vale %d\n", b, a, bit); 
46: 
47:   return 0;
48: }
49: 
50: 
51: void stampabinario(int x)
52: {
53:   // questa funzione stampa i 32 bit di un int
54:   // non conosciamo ancora il controllo di flusso, quindi e' scritta
55:   // in maniera non particolarmente efficiente
56: 
57:   // per stampare estraggo i singoli bit portandoli nella posizione meno significativa
58:   // mediante shift a destra e poi li isolo con un and bit a bit
59: 
60:   printf("%d", x >> 31 & 1);
61:   printf("%d", x >> 30 & 1);
62:   printf("%d", x >> 29 & 1);
63:   printf("%d", x >> 28 & 1);
64:   printf("%d", x >> 27 & 1);
65:   printf("%d", x >> 26 & 1);
66:   printf("%d", x >> 25 & 1);
67:   printf("%d", x >> 24 & 1);
68:   printf(" ");
69:   printf("%d", x >> 23 & 1);
70:   printf("%d", x >> 22 & 1);
71:   printf("%d", x >> 21 & 1);
72:   printf("%d", x >> 20 & 1);
73:   printf("%d", x >> 19 & 1);
74:   printf("%d", x >> 18 & 1);
75:   printf("%d", x >> 17 & 1);
76:   printf("%d", x >> 16 & 1);
77:   printf(" ");
78:   printf("%d", x >> 15 & 1);
79:   printf("%d", x >> 14 & 1);
80:   printf("%d", x >> 13 & 1);
81:   printf("%d", x >> 12 & 1);
82:   printf("%d", x >> 11 & 1);
83:   printf("%d", x >> 10 & 1);
84:   printf("%d", x >>  9 & 1);
85:   printf("%d", x >>  8 & 1);
86:   printf(" ");
87:   printf("%d", x >>  7 & 1);
88:   printf("%d", x >>  6 & 1);
89:   printf("%d", x >>  5 & 1);
90:   printf("%d", x >>  4 & 1);
91:   printf("%d", x >>  3 & 1);
92:   printf("%d", x >>  2 & 1);
93:   printf("%d", x >>  1 & 1);
94:   printf("%d", x       & 1);
95: }
96: 
97: 
98: 


Se avete commenti o osservaƶioni su questa pagina
mandate un messaggio di posta elettronica a bertoƶƶi@ce.unipr.it