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
mandate un messaggio di posta elettronica a bertoƶƶi@ce.unipr.it