Für 32-Bit-Ganzzahlen ist dies eine einfache und unkomplizierte Route:
unsigned int n;
n--;
n |= n >> 1; // Divide by 2^k for consecutive doublings of k up to 32,
n |= n >> 2; // and then or the results.
n |= n >> 4;
n |= n >> 8;
n |= n >> 16;
n++; // The result is a number of 1 bits equal to the number
// of bits in the original number, plus 1. That's the
// next highest power of 2.
Hier ist ein konkreteres Beispiel. Nehmen wir die Zahl 221, die binär 11011101 ist:
n--; // 1101 1101 --> 1101 1100
n |= n >> 1; // 1101 1100 | 0110 1110 = 1111 1110
n |= n >> 2; // 1111 1110 | 0011 1111 = 1111 1111
n |= n >> 4; // ...
n |= n >> 8;
n |= n >> 16; // 1111 1111 | 1111 1111 = 1111 1111
n++; // 1111 1111 --> 1 0000 0000
Es gibt ein Bit an der neunten Position, das 2 ^ 8 oder 256 darstellt, was in der Tat die nächstgrößere Potenz von 2 ist . Jede der Verschiebungen überlappt alle vorhandenen 1 Bits in der Zahl mit einigen der zuvor unberührten Nullen, wodurch schließlich eine Anzahl von 1 Bits erzeugt wird, die der Anzahl der Bits in der ursprünglichen Zahl entspricht. Das Hinzufügen von eins zu diesem Wert ergibt eine neue Potenz von 2.
Ein anderes Beispiel; Wir werden 131 verwenden, was 10000011 in binär ist:
n--; // 1000 0011 --> 1000 0010
n |= n >> 1; // 1000 0010 | 0100 0001 = 1100 0011
n |= n >> 2; // 1100 0011 | 0011 0000 = 1111 0011
n |= n >> 4; // 1111 0011 | 0000 1111 = 1111 1111
n |= n >> 8; // ... (At this point all bits are 1, so further bitwise-or
n |= n >> 16; // operations produce no effect.)
n++; // 1111 1111 --> 1 0000 0000
Und tatsächlich ist 256 die nächsthöhere Potenz von 2 von 131.
Wenn die Anzahl der zur Darstellung der Ganzzahl verwendeten Bits selbst eine Zweierpotenz ist, können Sie diese Technik weiterhin effizient und unbegrenzt erweitern (z. B. eine n >> 32
Zeile für 64-Bit-Ganzzahlen hinzufügen ).