用于返回下一个最高功率2的位操作

时间:2014-09-17 00:59:07

标签: c bit-manipulation

我想创建一个返回2 ^ p的下一个倍数的函数。

这是一次尝试,但不确定它是否有效......:

#define P 20
#define ALIGN_FORWARD(x, alignment) ((((int)x) + ((alignment)-1)) & (~((alignment)-1)))

int round_up(int x) 
{
  return ALIGN_FORWARD(x, P);
}

1 个答案:

答案 0 :(得分:2)

此代码段首先填满最高设置位以下的所有位。在v |= v >> 1之后,可以复制前两位,依此类推。最后,该值增加1。

uint32_t v = ...;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v += 1;

unsigned的{​​{1}}部分很重要,因为否则结果将始终为uint32_t,因为符号位会因移位操作而延长。如果值为0,那么您必须添加更多转移,如果它是uint64_t,则必须移除转移。

如果输入为8,则结果为16.如果您不喜欢,则需要测试输入是否为2的幂。当你递减它时,知道2的幂的二进制表示是一个字符更短(8 = 0b1000,7 = 0b111),你可以使用这个守卫:

uint16_t

(从记忆中转载。来自https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2的原文,其中包含更多有趣的技巧。)