Je veux calculer le plus petit entier avec exactement k
bits, c’est-à-dire supérieur à un autre entier x
.
Par exemple, si x = 1001010
alors pour k=2
, la réponse devrait être 1010000
pour k=4
, la réponse devrait être 1001011
et pour k=5
la réponse est 1001111
Je pense qu’il faudrait définir au moins autant de bits que les bits les plus à gauche définis dans l’entier x
, puis choisir entre définir le bit côté MSB adjacent au bit défini le plus à gauche dans x
, ou définir le bit défini le plus à gauche suivant et ensuite, regardez comment définir les bits qui suivent en répétant le même processus; tout en comptant les bits laissés de la k.
Je ne suis pas sûr que ce soit la bonne approche.
++x; while (popcnt(x) > k) { // Substitute the least-significant group of bits // with single bit to the left of them x |= x-1; ++x; } unsigned bit = 1; while (popcnt(x) < k) { x |= bit; bit <<= 1; }
La deuxième boucle peut être optimisée:
for (i = k - popcnt(x); i != 0; --i) { // Set the lowest non-set bit x |= x+1; }