Есть ли одно выражение (возможно, логическое) для получения ближайшего номера 2^n
для заданного целого?
Пример: 5,6,7 должен быть 8.
Есть ли одно выражение (возможно, логическое) для получения ближайшего номера 2^n
для заданного целого?
Пример: 5,6,7 должен быть 8.
Радиус действия до следующей более высокой мощности: см. бит-скручивающиеся хаки.
В 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 ^ n число. Вы можете сделать журнал в режиме 2, а затем определить следующее целочисленное значение.
Для java это можно сделать так:
Math.ceil(Math.log(x)/Math.log(2))
Ваши требования немного запутаны, ближайшая сила от 2 до 5 - 4. Если вы хотите, это следующая мощность 2 от числа, то следующее выражение Mathematica делает то, что вы хотите:
2^Ceiling[Log[2, 5]] => 8
Из этого следует просто определить один слой в большинстве языков программирования.
Для следующей мощности в два раза от заданного целого x
2^(int(log(x-1,2))+1)
или, альтернативно (если у вас нет функции log
, принимающей базовый аргумент
2^(int(log(x-1)/log(2))+1)
Обратите внимание, что это не работает для x < 2
Это можно сделать, сдвинув правую сторону на входном номере до тех пор, пока он не станет 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);
}
Поскольку название вопроса равно "Раунд до ближайшей силы двух", я подумал, что было бы полезно включить решение этой проблемы.
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;
}
В основном он находит как предыдущую, так и следующую мощность двух, а затем возвращает ближайшую.