2010-02-06 14 views
6

Ich bin auf diesen Code für die binäre Darstellung einer Zahl gestoßen. Ich möchte die Notwendigkeit für die Verwendung wissen !! im Code.Binäre Darstellung einer Zahl 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; 
} 

Antwort

7

Das Flag verwendet wird, hat nur das MSB gesetzt und alle anderen Bits gelöscht, so dass, wenn Sie bitwise and es mit Nummer, die Sie das MSB der Zahl testen können.

Es gibt zwei Ergebnisse der bitweisen anding:

  • Null - bedeutet die Zahl 0 in seiner MSB hatte.
  • Non-Zero - bedeutet, dass die Nummer 1 in ihr MSB hatte.

Jetzt müssen wir einen Weg

Non-zero -> 1 
Zero -> 0 

so abzubilden wir die doppelte Negation verwenden. konvertieren

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

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

MSB = höchstwertiges Bit – pug

+0

abwechselnd, 'printf (((n & Flag)?" 1 ":" 0 "));' – Hasturkun

10

!! jeden Wert ungleich Null auf 1 und Null-Wert als Null verlassen:

Das gleiche verwendet haben könnte getan.

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

Es ist ein Bool Cast des armen Mannes.

+0

In einigen Implementierungen von C wird es 0 oder -1 statt 0 sein oder 1. –

+1

Nicht, wenn die Implementierung standardkonform ist. Gemäß dem aktuellen Standardentwurf 6.3.1.2, "Wenn ein Skalarwert in _Bool konvertiert wird, ist das Ergebnis 0, wenn der Wert gleich 0 ist; andernfalls ist das Ergebnis 1." –

+2

@ T.J. Crowder: Nein. Logische Operatoren werden garantiert zu 0 oder 1 ausgewertet. Genauer gesagt: "Das Ergebnis der logischen Negation ist 0, wenn der Wert seines Operanden ungleich 0 ist, 1, wenn der Wert seines Operanden gleich 0 ist." (6.5.3.3/5 des C99-Standards) – jamesdlin

2

Ich würde !!x weniger verwirrend als x != 0 schreiben.

Verwandte Themen