2017-08-30 3 views
2

Ich muss den Maskenwert in Bezug auf die vom Benutzer angegebene Nummer herausfinden.High-Bit auf 1 setzen und Bits auf 0 setzen [Beispiel: 10110 bis 10000]

Zum Beispiel. Wenn der Benutzer liefert eine Eingabe als

22 (binär 10110)

und dann muss ich den Maskenwert finden, indem das hohe Bit des Eingangs als 1 verändern und zu 0 ruhen. Also in diesem Fall sollte es sein:

16 (binär 10000)

Gibt es eine integrierte Methode in c Sprache zu tun.

+0

Sind Sie auf der Suche nach binären und? ('22 & 16 == 16') – cubrr

+0

Sie wollen also das höchste Bit, das 1 ist, behalten und alle anderen auf Null setzen? Beispiele: 1010 -> 1000, 10100111 -> 100000000, 111 -> 100 usw. Es gibt keine solche eingebaute Funktion, aber Sie können leicht selbst eine schreiben (geschätzt 4-5 Zeilen). –

+0

@cubrr Wenn ich bereits Wert 16 habe, was macht AND dann hier? Beispiel wenn die Eingabe 86 ist, dann muss der zweite Operand berechnet werden und das ist mein Ziel. – user5708039

Antwort

1

Sie die Position des höchsten Bit

Sobald Sie es haben, nur nach links verschoben, um den richtigen Maskenwert zu erhalten

berechnen könnte:

unsigned int x = 22; 
    int result = 0; 

    if (x != 0) 
    { 
    unsigned int y = x; 
    int bit_pos=-1; 
    while (y != 0) 
    { 
     y >>= 1; 
     bit_pos++; 
    } 
    result = 1<<bit_pos; 
    } 

dies setzt result-16

(es gibt ein bestimmter Fall, wenn der eingegebene Wert 0 ist)

+0

Thx für Ihre Antwort. funktioniert perfekt. – user5708039

0

Grundsätzlich müssen Sie Boden ausrichten zu die nächste Potenz von zwei Zahlen. Ich bin mir nicht sicher, dass es dafür eine Standardfunktion gibt, aber versuchen Sie Folgendes:

static inline uint32_t 
floor_align32pow2(uint32_t x) 
{ 
     x |= x >> 1; 
     x |= x >> 2; 
     x |= x >> 4; 
     x |= x >> 8; 
     x |= x >> 16; 

     return (x >> 1) + (x & 1); 
} 
+1

Dies funktioniert nicht, wenn das oberste Bit der Eingabe festgelegt ist, z. 'floor_align32pow2 (0x80000000)' gibt 0 anstelle von 0x80000000 zurück. Sie können es mit 'return (x >> 1) + (x & 1);' '. –

+0

@IanAbbott Sie haben Recht, danke –

Verwandte Themen