我有下一个功能:
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值)。
有人可以向我解释吗?
答案 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;
}