2016-05-27 18 views
0

In c, ich weiß eine unsigned Char ist von Größe 1 Byte (= 1 Oktett = 8 Bits), und ich weiß, dass ein unsigned Char ist tatsächlich ein ganzzahliger Wert zwischen 0 und 255, jetzt, wenn I haben folgende unsigned char-Variable:

Wie erhält man den Wert jedes Bits eines vorzeichenlosen Zeichens?

unsigned char c = 255; //(this value can be any value from 0 to 255) 


Wie konnte ich eine Tabelle mit 8 Elementen erhalten anzeigt jedes Bit-Wert (0 oder 1) dieser variablen? (etwa so: {1, 1, 1, 1, 1, 1, 1, 1}) Gibt es einen einfachen Weg, dies in c zu tun?

+3

Hinweis: Auf seltenen Maschinen ist 'unsigned char' mehr als 8 Bit. Verwende 'CHAR_BIT'. – chux

+0

Das ist Mathe, reine einfache (?) Mathematik. – alk

+0

Ich testete es auf meinem Acer e-15 dann die Größe von (unsigned char) gibt mir 1 (Byte) als Ergebnis, das ist nicht so selten wie Sie denken ...... – SWIIWII

Antwort

3

Ein gemeinsamer Ansatz Bits in C zu extrahieren unter Verwendung von Bit-Verschiebeoperation:

int bits[8]; 
for (int i = 0 ; i != 8 ; i++) { 
    bits[i] = (c & (1 << i)) != 0; 
} 

1 << i erzeugt Binärzahlen mit 1 Satz in i -te Position, dh 1 2, 10 2 , 100 , 1000 , und so weiter.

Operator & verwendet 1 << i als „Maske“, ein einzelnes Bit c gekennzeichnet durch 1 im Wert der Maske auswählen. Der Vergleich != 0 vervollständigt den Job und erzeugt Null oder Eins abhängig vom Wert des Bits.

Ein weiterer Ansatz ist c nach rechts verschoben, und Maskierung mit 1, wie folgt aus:

int bits[8]; 
for (int i = 0 ; i != 8 ; i++) { 
    bits[i] = (c >> i) & 1; 
} 

Dies ist ähnlich dem ersten Ansatz, aber die Maskierung in dem am wenigsten signifikanten Bit-Position erfolgt.

Hinweis: Auf Computern mit CHAR_BIT, die auf eine andere Zahl als 8 eingestellt sind, würden nur die unteren 8 Bits extrahiert.

+0

Dies wird auf einigen TI-Chips fehlschlagen, wenn ein Byte beispielsweise nicht aus 8 Bits besteht. – DevNull

+0

@SWIIWII Es ist korrekt, es ist nur LSB zuerst ("rückwärts") ausgeschrieben. 83 in binär ist 0b1010011, also wenn Sie möchten, dass Ihr MSB zuerst ist, verwenden Sie Bits [7-i] 'anstelle von' Bits [i] 'in der Zuweisung. – dasblinkenlight

+0

@dasblinkenlight Ich stimme nicht zu. TC/OP gibt nur (falsch) an, dass ein Byte = 8 Bits ist, nicht das auf seiner/ihrer spezifischen Plattform dies der spezifische Fall ist. – DevNull

1

neben bitweise Operationen (die besser und ich würde sagen, dass Standard-Weg, dies zu tun), können Sie Gewerkschaften verwenden, um einzelne Bits zugreifen:

typedef union { 
    unsigned char c; 
    struct { 
     unsigned char b0 :1; 
     unsigned char b1 :1; 
     unsigned char b2 :1; 
     unsigned char b3 :1; 
     unsigned char b4 :1; 
     unsigned char b5 :1; 
     unsigned char b6 :1; 
     unsigned char b7 :1; 
    }; 
} byte_struct; 

int main(int argc, char** argv) { 
    byte_struct c; 
    c.c = 0xaa; 

    printf("%u\n", c.b7); 
    printf("%u\n", c.b6); 
    printf("%u\n", c.b5); 
    printf("%u\n", c.b4); 
    printf("%u\n", c.b3); 
    printf("%u\n", c.b2); 
    printf("%u\n", c.b1); 
    printf("%u\n", c.b0); 

    return (EXIT_SUCCESS); 
} 

Anmerkung: Reihenfolge der Einzel-Bit-Variablen ist Implementierung definiert, also sollten Sie vorsichtig mit ihnen sein und Compiler-spezifische Flags verwenden, um Reihenfolge zu erzwingen

+5

Tun Sie dies nicht: * Die Reihenfolge der Zuweisung von Bit-Feldern innerhalb einer Einheit (hoch-zu niedriger Ordnung oder niedriger Ordnung zu hoher Ordnung) ist implementation-defined * In Englisch: Bit-Feld Mitglied 'b0 'könnte nicht das niedrigstwertige Bit darstellen. – 2501

+1

@ 2501 Ja, es ist die Implementierung definiert, aber es bedeutet nicht, dass Sie es nicht verwenden können, Sie können es über Compiler-Flags steuern und somit davon abhängen, natürlich können Sie auch Ihr Bein schießen –

Verwandte Themen