2010-02-06 20 views
6

Mi sono imbattuto in questo codice per la rappresentazione binaria di un numero. Voglio sapere la necessità di usare !! nel codice.Rappresentazione binaria di un numero in C

int main() { 
    int n,i; 
    unsigned flag = 1<<(sizeof(int) * 8 - 1);  

    printf("Input the number\n"); 
    scanf("%d",&n);  
    for(i=0;i<sizeof(int)*8;i++) {  
      printf("%d",!!(n & flag));  
      n = n << 1; 
    } 
    return 0; 
} 

risposta

7

La bandiera usata ha solo il set di MSB e tutti gli altri bit eliminato, in modo che quando si bitwise and con il numero è possibile testare il MSB del numero.

Ci sono due risultati della AND bit a bit:

  • Zero - significa che il numero era 0 nella sua MSB.
  • Non azzerato - significa che il numero aveva 1 in suo MSB.

Ora abbiamo bisogno di un modo per mappare

Non-zero -> 1 
Zero -> 0 

in modo da utilizzare la doppia negazione.

La stessa cosa si sarebbe potuto fare con:

for(i=0;i<sizeof(int)*8;i++) { 

    (n & flag) ? printf("1"):printf("0"); 
    n = n << 1; 
} 
+2

MSB = Bit più significativo – pug

+0

alternativamente, 'printf (((n & flag)?" 1 ":" 0 "));' – Hasturkun

10

!! sarà convertire qualsiasi valore diverso da zero a 1, e lasciare valore zero come zero.

x = 0; 
y = 50; 
!x; // 1 
!y; // 0 
!!x; // 0 
!!y; // 1 

È il cast di un uomo povero.

+0

In alcune implementazioni di C, sarà 0 o -1 anziché 0 o 1. –

+1

Non se l'implementazione è conforme agli standard. Secondo la bozza attuale della norma 6.3.1.2, "Quando un valore scalare viene convertito in _Bool, il risultato è 0 se il valore è uguale a 0, altrimenti il ​​risultato è 1." –

+2

@ T.J. Crowder: No. Gli operatori logici sono garantiti per valutare su 0 o 1. Specificamente: "Il risultato della negazione logica è 0 se il valore del suo operando è diverso da 0, 1 se il valore del suo operando è uguale a 0." (6.5.3.3/5 della norma C99) – jamesdlin

2

Vorrei scrivere !!x in modo meno confuso come x != 0.

Problemi correlati