it-swarm-eu.dev

Arrondir à la puissance de deux la plus proche

Existe-t-il une expression d'une ligne (éventuellement booléenne) pour obtenir le numéro 2^n le plus proche pour un entier donné?

Exemple: 5,6,7 doit être 8.

24
abbs

Arrondissez à la puissance deux plus proche: voir bidouilles .

En C:

unsigned int v; // compute the next highest power of 2 of 32-bit v

v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
28
Jason S

Je pense que vous voulez dire plus proche numéro 2 ^ n prochain. Vous pouvez créer un journal sur le mode 2, puis déterminer la valeur entière suivante.

Pour Java, cela peut être fait comme:

Math.ceil(Math.log(x)/Math.log(2))
16
Ankit Bansal

Vos exigences sont un peu confuses, la puissance la plus proche de 2 à 5 est 4. Si ce que vous voulez est la puissance suivante de 2 à partir du nombre, l'expression Mathematica expression fait ce que vous voulez:

2^Ceiling[Log[2, 5]] => 8

A partir de là, il devrait être facile de trouver un one-line dans la plupart des langages de programmation.

6

Pour la puissance suivante de deux à partir d'un entier donné x

2^(int(log(x-1,2))+1)

ou bien alternativement (si vous n'avez pas de fonction log acceptant un argument base

2^(int(log(x-1)/log(2))+1)

Notez que cela ne fonctionne pas pour x <2

4
El Ronnoco

Comme le titre de la question est "Arrondir à la puissance de deux la plus proche", j’ai pensé qu’il serait utile d’inclure également une solution à ce problème.

int nearestPowerOfTwo(int n)
{
    int v = n; 

    v--;
    v |= v >> 1;
    v |= v >> 2;
    v |= v >> 4;
    v |= v >> 8;
    v |= v >> 16;
    v++; // next power of 2

    int x = v >> 1; // previous power of 2

    return (v - n) > (n - x) ? x : v;
}

En gros, il trouve à la fois la puissance précédente et la suivante, puis renvoie la puissance la plus proche.

4
maff

Cela peut être fait en décalant à droite le nombre entré jusqu'à ce qu'il devienne 0 et en conservant le nombre de décalages. Cela donnera la position du bit le plus significatif. Obtenir 2 à la puissance de ce nombre nous donnera la puissance de 2 la plus proche.

public int NextPowerOf2(int number) {
    int pos = 0;

    while (number > 0) {
        pos++;
        number = number >> 1; 
    }
    return (int) Math.pow(2, pos);
}
2
Naveen Venkatesh

Modifié pour VBA. NextPowerOf2_1 ne semble pas fonctionner. J'ai donc utilisé la méthode de la boucle. J'avais besoin d'un changement d'opérateur plutôt sage.

Sub test()
    NextPowerOf2_1(31)
    NextPowerOf2_2(31)
    NextPowerOf2_1(32)
    NextPowerOf2_2(32)
End Sub

Sub NextPowerOf2_1(ByVal number As Long) ' Does not work
    Debug.Print 2 ^ (Int(Math.Log(number - 1) / Math.Log(2)) + 1)
End Sub

Sub NextPowerOf2_2(ByVal number As Long)
    Dim pos As Integer
    pos = 0
    While (number > 0)
        pos = pos + 1
        number = shr(number, 1)
    Wend

    Debug.Print 2 ^ pos
End Sub
Function shr(ByVal Value As Long, ByVal Shift As Byte) As Long
    Dim i As Byte
    shr = Value
    If Shift > 0 Then
        shr = Int(shr / (2 ^ Shift))
    End If
End Function
0
Cuinn Herrick