PDA

Visualizza la versione completa : [C] Operatore AND bitwise (&)


ginetto79
23-02-2011, 17:41
Salve a tutti,

sto studiando gli operatori bitwise e ho subito alcuni dubbi che non riesco a risolvere (tra google e prove)!! :dh:
Sul mio libro presente la seguente descrizione dell'operatore AND bitwise: i bit del risultato sono impostati a 1, se quelli corrispondenti dei due operandi sono entrambi 1.
Fin qui, sembra tutto chiaro.
Poi il testo fa il seguente esempio:



/* Printing an unsigned integer in bits */

#include <stdio.h>



void displayBits( unsigned value ); /* prototype */



int main( void )

{

unsigned x; /* variable to hold user input */



printf( "Enter an unsigned integer: " );

scanf( "%u", &x );



displayBits( x );



return 0; /* indicates successful termination */



} /* end main */



/* display bits of an unsigned integer value */

void displayBits( unsigned value )

{

unsigned c; /* counter */



/* define displayMask and left shift 31 bits */

unsigned displayMask = 1 << 31;



printf( "%10u = ", value );



/* loop through bits */

for ( c = 1; c <= 32; c++ ) {

putchar( value & displayMask ? '1' : '0' );

printf("%d\n", value & displayMask);


value <<= 1; /* shift value left by 1 */



if ( c % 8 == 0 ) { /* output space after 8 bits */

putchar( ' ' );

} /* end if */



} /* end for */



putchar( '\n' );

} /* end function displayBits */


Come esempio viene inserito il numero 65000 e il programma da il seguente risultato:

00000000 00000000 11111101 11101000

che effettivamente corrisponde a 65000 scritto in binario.

Ecco i miei dubbi.
value rappresenta la sequenza di bit:
10000000 00000000 00000000 00000000
che corrisponde al numero 2^31 = 2147483648

quando value viene confrontato con un altro numero attraverso l'AND bitwise, il risultato sar
00000000 00000000 00000000 00000000 ossia 0
oppure
10000000 00000000 00000000 00000000 ossia 2^31 = 2147483648

dato che 2^31 > 0, esso viene valutato come VERO e un uno viene stampato.
Fin qui corretto quello che ho detto?

La cosa strana che se faccio printf("%d\n", value & displayMask); all'interno del loop for ottengo una lista di due output:
00 e
1-2147483648

Come mai c' "1-" davanti al numero che mi aspetto?
Altra domanda: non c' un modo pi semplice (diretto) per stampare i bit di un numero?

Grazie a tutti!!
:ciauz:

jobv
24-02-2011, 08:43
Ciao,

%d nella printf stampa un intero con segno e, visto che il primo bit 1 allora ti stmpa il numero negativo. Prova con %u.

ginetto79
28-02-2011, 17:53
Originariamente inviato da jobv
%d nella printf stampa un intero con segno e, visto che il primo bit 1 allora ti stmpa il numero negativo. Prova con %u.

Effettivamente non stampa il numero negativo... anche se quando mettevo %d non solo mi stampava il segno meno, ma anche il numero "1"... che vuol dire questo "1"?

Com' la storia dei numeri negativi che iniziano con 1?

Poi, qualcuno sa un modo pi diretto per stampare i bit di un numero, senza dover eseguire la funzione descritta sopra?

:ciauz:

simo_85
01-03-2011, 11:11
Originariamente inviato da ginetto79
Effettivamente non stampa il numero negativo... anche se quando mettevo %d non solo mi stampava il segno meno, ma anche il numero "1"... che vuol dire questo "1"?
Com' la storia dei numeri negativi che iniziano con 1?
Poi, qualcuno sa un modo pi diretto per stampare i bit di un numero, senza dover eseguire la funzione descritta sopra?
:ciauz:
Nella rappresentazione dei numeri binari, esiste un bit che riservato al segno, vale 0 se il numero positivo e 1 se negativo

ginetto79
01-03-2011, 15:47
Originariamente inviato da simo_85
Nella rappresentazione dei numeri binari, esiste un bit che riservato al segno, vale 0 se il numero positivo e 1 se negativo

Intendi l'1 che viene stampato o il primo 1 della cifra binaria?

In ogni caso, se l'1 di 10000000 00000000 00000000 00000000 indica il segno negativo, esso indica anche che stiamo parlando della cifra 2147483648... non mi sembra molto logico. Allora come indicare +2147483648?

MItaly
01-03-2011, 15:56
Originariamente inviato da ginetto79
Allora come indicare +2147483648?
Infatti non lo puoi indicare; il range di un intero con segno a 32 bit [-2147483648, +2147483647].
Leggi qui (http://en.wikipedia.org/wiki/Two%27s_complement).

simo_85
02-03-2011, 03:09
Originariamente inviato da ginetto79
Intendi l'1 che viene stampato o il primo 1 della cifra binaria?

In questo caso si fa sempre riferimento al MSB.


In ogni caso, se l'1 di 10000000 00000000 00000000 00000000 indica il segno negativo...
Per la rappresentazione dei numeri negativi si usa il complemento a 2 (http://en.wikipedia.org/wiki/Two%27s_complement).

ginetto79
02-03-2011, 18:04
Diciamo che la stessa sequenza di bit verr intepretata in modo diverso se la leggo come un numero signed o unsigned, giusto?

Ma possibile che non esiste un modo pi diretto per andare a vedere con quali bit un numero memorizzato? Non so, andare nella locazione di memoria dove memorizzato il numero e leggere i bit...
Devo per forza ricorrere a una stratagemma come la funzione precedente per stampare questi bit?

simo_85
02-03-2011, 20:55
Si. Il modo migliore secondo me tenersi a mente questo


0 0x0 0000
1 0x1 0001
2 0x2 0010
3 0x3 0011
4 0x4 0100
5 0x5 0101
6 0x6 0110
7 0x7 0111
8 0x8 1000
9 0x9 1001
10 0xa 1010
11 0xb 1011
12 0xc 1100
13 0xd 1101
14 0xe 1110
15 0xf 1111

:D

Loading