Подтвердить что ты не робот

Раунд до ближайшей силы двух

Есть ли одно выражение (возможно, логическое) для получения ближайшего номера 2^n для заданного целого?

Пример: 5,6,7 должен быть 8.

4b9b3361

Ответ 1

Радиус действия до следующей более высокой мощности: см. бит-скручивающиеся хаки.

В 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++;

Ответ 2

Я думаю, вы имеете в виду следующее ближайшее 2 ^ n число. Вы можете сделать журнал в режиме 2, а затем определить следующее целочисленное значение.

Для java это можно сделать так:

Math.ceil(Math.log(x)/Math.log(2))

Ответ 3

Ваши требования немного запутаны, ближайшая сила от 2 до 5 - 4. Если вы хотите, это следующая мощность 2 от числа, то следующее выражение Mathematica делает то, что вы хотите:

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

Из этого следует просто определить один слой в большинстве языков программирования.

Ответ 4

Для следующей мощности в два раза от заданного целого x

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

или, альтернативно (если у вас нет функции log, принимающей базовый аргумент

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

Обратите внимание, что это не работает для x < 2

Ответ 5

Это можно сделать, сдвинув правую сторону на входном номере до тех пор, пока он не станет 0 и не будет удерживать счетчик сдвигов. Это даст положение наиболее значительного 1 бит. Получение 2 к силе этого числа даст нам следующую ближайшую силу 2.

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

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

Ответ 6

Поскольку название вопроса равно "Раунд до ближайшей силы двух", я подумал, что было бы полезно включить решение этой проблемы.

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;
}

В основном он находит как предыдущую, так и следующую мощность двух, а затем возвращает ближайшую.