此功能的行为是什么? (二的幂)

时间:2018-11-23 22:58:41

标签: c

我有下一个功能:

static inline int nextPowerOfTwo(int n) {
    n--;

    n = n >>  1 | n;
    n = n >>  2 | n;
    n = n >>  4 | n;
    n = n >>  8 | n;
    n = n >> 16 | n;
    //  n = n >> 32 | n;    //  For 64-bit ints

    return ++n;
}

但是我不知道他的行为是什么(函数输出-his功能-)

我也不知道每行的行为(每行后面的n值)。

有人可以向我解释吗?

1 个答案:

答案 0 :(得分:7)

该代码来自Bit Twiddling Hacks

  

向上舍入为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++;
     

[...]

     

通过将最高的设置位复制到所有较低的位来工作   位,然后加一个,导致进位将所有   低位为0,最高位为1。   原始数字是2的幂,那么减量将减少   减一,以便我们舍入到相同的原始值。

明显的16、32和64位版本:

#include <stdint.h>

uint16_t round_u16_to_pow2(uint16_t v)
{
    v--;
    v |= v >> 1;
    v |= v >> 2;
    v |= v >> 4;
    v |= v >> 8;
    v++;
    return v;
}

uint32_t round_u32_to_pow2(uint32_t v)
{
    v--;
    v |= v >> 1;
    v |= v >> 2;
    v |= v >> 4;
    v |= v >> 8;
    v |= v >> 16;
    v++;
    return v;
}

uint64_t round_u64_to_pow2(uint64_t v)
{
    v--;
    v |= v >> 1;
    v |= v >> 2;
    v |= v >> 4;
    v |= v >> 8;
    v |= v >> 16;
    v |= v >> 32;
    v++;
    return v;
}