2010-02-06 10 views
6

Encontré este código para la representación binaria de un número. ¡Quiero saber la necesidad de usarlo! en el código.Representación binaria de un número en 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; 
} 

Respuesta

7

La bandera utilizada sólo tiene el conjunto MSB y todos los demás bits despejados, por lo que cuando se bitwise and con número puede probar el MSB en el número.

hay dos resultados de la operación AND bit a bit:

  • Cero - significa el número 0 tenía en su MSB.
  • No cero: significa que el número tenía 1 en MSB.

Ahora necesitamos una manera de asignar

Non-zero -> 1 
Zero -> 0 

por lo que utilizar la doble negación.

Lo mismo se podría haber hecho usando:

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

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

MSB = Bit más significativo – pug

+0

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

10

!! convertirá cualquier valor distinto de cero a 1, y dejar como valor cero cero.

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

Es el reparto del hombre pobre de un bool.

+0

En algunas implementaciones de C, será 0 o -1 en lugar de 0 o 1. –

+1

No si la implementación cumple con los estándares. De acuerdo con el borrador actual de la norma 6.3.1.2, "Cuando cualquier valor escalar se convierte a _Bool, el resultado es 0 si el valor se compara con 0, de lo contrario, el resultado es 1." –

+2

@ T.J. Crowder: No. Los operadores lógicos tienen la garantía de evaluar a 0 o 1. Específicamente: "El resultado de la negación lógica es 0 si el valor de su operando se compara desigual a 0, 1 si el valor de su operando se compara con 0". (6.5.3.3/5 del estándar C99) – jamesdlin

2

Escribiría !!x de manera menos confusa como x != 0.

Cuestiones relacionadas