Pour les nombres entiers de 32 bits, c'est une simple 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.
Voici un exemple plus concret. Prenons le numéro 221, qui est 11011101 en binaire:
n--; // 1101 1101 --> 1101 1100
n |= n >> 1; // 1101 1101 | 0110 1110 = 1111 1111
n |= n >> 2; // ...
n |= n >> 4;
n |= n >> 8;
n |= n >> 16; // 1111 1111 | 1111 1111 = 1111 1111
n++; // 1111 1111 --> 1 0000 0000
Il y a un peu dans le neuvième position, ce qui représente 2^8, ou 256, qui est en effet la deuxième plus grande puissance de 2. Chacun des quarts de travail chevauche toutes les bits à 1 dans le nombre avec une partie de la auparavant intactes les zéros, finit par produire un certain nombre de bits à 1 égal au nombre de bits dans le numéro d'origine. L'ajout d'une valeur produit une nouvelle puissance de 2.
Un autre exemple, nous allons utiliser 131, qui est 10000011 en binaire:
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
Et en effet, 256 est la prochaine plus haute puissance de 2 131.
Si le nombre de bits utilisés pour représenter l'entier est lui-même une puissance de 2, vous pouvez continuer à étendre cette technique de manière efficace et à l'infini (par exemple, ajouter un n >> 32
ligne pour les entiers 64 bits).