Salve a tutti,
sto studiando gli operatori bitwise e ho subito alcuni dubbi che non riesco a risolvere (tra google e prove)!!
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:
codice:
/* 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!!