2012-08-23 4 views
6

Sto provando VERAMENTE a capovolgere i bit in una variabile C int. Lo sto facendo in questo modo:La negazione bit a bit C crea un'uscita negativa:

input = 15; 

input = ~input; 

printf("%d", input); 

ma mostra sempre come -16. Dovrebbe essere 0! se 15 è scritto come 1111, perché restituisce 10000?! Questo è esasperante! Qualcuno può PER FAVORE aiutarmi !?

+0

Hai dimenticato le virgolette nel formato '% d'; Li ho aggiunti. –

+0

grazie .... Ero un po 'isterico e ho dimenticato di aggiungere quello .... – Mizmor

+1

Generalmente è meglio copiare e incollare il tuo codice di lavoro effettivo; che evita accuratamente errori di battitura e errori simili. –

risposta

10

Dal int sul sistema è molto probabilmente un numero a 32 bit, tutti i bit sono capovolte, compresi quelli che erano zeri non significativi nel numero originale:

00000000000000000000000000001111 

diventa

11111111111111111111111111110000 

Questo è un numero negativo: il bit più significativo di 15 è zero, quindi diventa 1 quando capovolto.

Se si desidera mantenere solo i bit del numero originale, è necessario mascherare con tutti quelli nelle posizioni significative del numero, in questo modo:

printf("%d\n", input & 0xF); 

AND re con 0xF "taglia fuori "tutti i bit tranne gli ultimi quattro.

+0

Ok, questo spiega il mio errore molto bene! Ora ho solo bisogno di trovare un modo per vedere solo i bit che sono interessati. Il mio compito è quello di trovare qualsiasi 0 nella rappresentazione di un intero senza i bit principali .... – Mizmor

2

15 è di tipo int. A seconda di quanto è grande int, la rappresentazione di 15 termina con 1111, ma è avvia con un gruppo di 0 s.

L'operatore ~ ribalta tutti i bit; gli 1 s (4 di essi) diventano 0 s e gli 0 s (N-4 di essi) diventano 1 s.

4

Ciò si verifica perché input comprende più di quattro bit. Se assumiamo che input è un signed char, con 8 bit (o un byte), allora:

input == 15 == 0x0F == 0b00001111 

Come si può vedere, i 4 bit più significativi di input sono tutti 0. Dopo un'operazione NOT di bit (~), abbiamo:

~input == -16 == 0xF0 == 0b11110000 

I quattro bit che prima erano zero ora sono quelli, e quelli sono ora zero. Il bit più significativo in una variabile firmata determina il suo segno (0 è positivo e 1 è negativo). Quindi, capovolgendo i bit il segno è stato invertito. Il numero negativo può essere letto come:

1  1  1  1  0  0  0 0 
-128 + 64 + 32 + 16 + 0 + 0 + 0 + 0 

che risolve il -16 che è stato stampato.

Se i tuoi compiti sono azzerare una variabile usando NOT bit a bit, prova a dichiarare input come unsigned char per evitare di doversi preoccupare del bit del segno. Quindi, impostare input su 255, il valore più alto che una variabile a 8 bit può contenere (0xFF o 0b11111111).