2010-12-07 11 views

Antwort

2

Bits lesen Sie

char get_bit(unsigned int n, int bit_num){ 
    if (bit_num < 0 || bit_num >= sizeof(int) * CHAR_BIT) 
     return -1; 
    return (n >> bit_num) & 1; 
}; 

Sein Hauptproblem verwenden können, ist, dass es nicht schnell ist, aber OP nicht einmal angegeben, wenn er numers oder Ziffern gesucht .

+0

Ich mag diese Antwort: nett und einfach, und wahrscheinlich sogar optimiert in eine native Bit-Test-Anweisung. Allerdings ein paar kleine Nitpicks: 1.) 'char' ist auf einigen Architekturen nicht signiert, also würde das Zurückgeben von' -1' wahrscheinlich '255' auf diesen Architekturen ergeben, 2.) Die Rückgabe eines' char' ist normalerweise nicht viel besser als Zurückgeben eines "int" aufgrund von Cs Neigung, Dinge zu fördern, und 3.) Wenn ich ich wäre, würde ich wahrscheinlich nur 'assert (bit_num> = 0 && bit_num

+0

@Joey: Nun, es ist ein Beispiel für einen Programmierer, der den Code nach seinen Bedürfnissen verwenden und refrazieren wird und nicht in die Bibliothek gestellt werden soll :) – ruslik

1

Ich weiß nicht, aber ich würde so etwas wie

int[32] bits = {}; 
int  value = 255; 
int  i = 0; 

while (value) 
{ 
    bits[i++] = value & 1; 
    value = value >> 1; 
} 
+1

Ich frage mich, was passiere Wert = -1 zu Ihrem Code :-) – 6502

+0

@ 6502: eine kleine Endlosschleife gefolgt von einem Segmentierungsfehler, nehme ich an. – ruslik

+0

Es wird ein Array voller 1s zurückgegeben. –

1

Eine einfache und schnelle Art und Weise machen ist eine ganze Zahl ohne Vorzeichen zu verwenden, wie ein „Cursor“ und verschiebt den Cursor auf vorab:

1000000000000000 
0100000000000000 
0010000000000000 
0001000000000000 
0000100000000000 
0000010000000000 
0000001000000000 
0000000100000000 
... 

bei jeder Iteration verwenden bitweise & irgendwelche Bits gemeinsam, wenn die Anzahl und der Cursor Anteil zu sehen.

Eine einfache Implementierung:

// number of bits in an unsigned int 
#define BIT_COUNT (CHAR_BIT * sizeof(unsigned int)) 

void toBits(unsigned int n, int bits[BIT_COUNT]) 
{ 
    unsigned int cursor = (unsigned int)1 << (BIT_COUNT - 1); 
    unsigned int i; 

    for (i = 0; i < BIT_COUNT; i++, cursor >>= 1) 
     out[i++] = (n & cursor) ? 1 : 0; 
} 
2
unsigned x = number; 
char buf[sizeof(int)*CHAR_BIT+1], *p=buf+sizeof(buf); 
for (*--p=0; x; x>>=1) *--p='0'+x%2; 
+0

Warum nicht ''0' | x% 2'? – ruslik

+0

Sie sollten mindestens '+' anstelle von '|' für reine Portabilität verwenden, da ''0'' nicht garantiert ist, gerade zu sein. 'x & 1' und' x% 2' sind 100% identisch für unsigned Operanden, also ist es nur eine Frage der Präferenz. –

+1

@R .: dann ''0' + x% 2'. Die Idee war, Klammern zu entfernen. – ruslik

Verwandte Themen