Окружение к следующему питанию 2

170
задан Colonel Panic 2 May 2017 в 12:57
поделиться

7 ответов

Проверьте Взломы Битового жонглирования . Необходимо получить основу 2 логарифма, затем добавить 1 к этому. Пример для 32-разрядного значения:

Окружают к следующему самому высокому питанию 2

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

, расширение других ширин должно быть очевидным.

129
ответ дан Toby Speight 23 November 2019 в 20:47
поделиться

Если Вам нужен он для связанного с OpenGL материала:

/* Compute the nearest power of 2 number that is 
 * less than or equal to the value passed in. 
 */
static GLuint 
nearestPower( GLuint value )
{
    int i = 1;

    if (value == 0) return -1;      /* Error! */
    for (;;) {
         if (value == 1) return i;
         else if (value == 3) return i*4;
         value >>= 1; i *= 2;
    }
}
-1
ответ дан Paulo Lopes 23 November 2019 в 20:47
поделиться

Поскольку IEEE плавает, Вы были бы в состоянии сделать что-то вроде этого.

int next_power_of_two(float a_F){
    int f = *(int*)&a_F;
    int b = f << 9 != 0; // If we're a power of two this is 0, otherwise this is 1

    f >>= 23; // remove factional part of floating point number
    f -= 127; // subtract 127 (the bias) from the exponent

    // adds one to the exponent if were not a power of two, 
    // then raises our new exponent to the power of two again.
    return (1 << (f + b)); 
}

при необходимости в целочисленном решении и Вы в состоянии использовать встроенный ассемблерный код, BSR даст Вам log2 целого числа на x86. Это рассчитывает, сколько правильных битов установлено, который точно равен log2 того числа. Другие процессоры (часто) имеют подобные инструкции, такие как CLZ и в зависимости от Вашего компилятора могло бы быть внутреннее доступное, чтобы сделать работу для Вас.

8
ответ дан Jasper Bekkers 23 November 2019 в 20:47
поделиться
unsigned long upper_power_of_two(unsigned long v)
{
    v--;
    v |= v >> 1;
    v |= v >> 2;
    v |= v >> 4;
    v |= v >> 8;
    v |= v >> 16;
    v++;
    return v;

}
49
ответ дан Eclipse 23 November 2019 в 20:47
поделиться
next = pow(2, ceil(log(x)/log(2)));

Это работает путем нахождения числа, которым у Вас было бы повышение 2 добраться, x (возьмите журнал числа и разделитесь на журнал желаемой основы, посмотрите Википедию для больше ). Тогда округлите в большую сторону, это с перекрывает для получения самого близкого питания целого числа.

Это - более общая цель (т.е. медленнее!) метод, чем поразрядные методы, связанные в другом месте, но хорошие для знания математики, а?

78
ответ дан s4y 23 November 2019 в 20:47
поделиться

Преобразуйте его в плавание и затем используйте .hex (), который показывает нормализованное представление IEEE.

>>> float(789).hex() '0x1.8a80000000000p+9'

Тогда просто извлекают экспоненту и добавляют 1.

>>> int(float(789).hex().split('p+')[1]) + 1 10

И повышение 2 к этому питанию.

>>> 2 ** (int(float(789).hex().split('p+')[1]) + 1) 1024

0
ответ дан 23 November 2019 в 20:47
поделиться

Вы могли бы найти, что следующее разъяснение было полезно к Вашей цели:

0
ответ дан 23 November 2019 в 20:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: