检查位扭曲黑客。您需要获取以2为底的对数,然后将其加1。32位值的示例:向上舍入到2的下一个最高幂unsigned int v; // compute the next highest power of 2 of 32-bit vv--;v |= v >> 1;v |= v >> 2;v |= v >> 4;v |= v >> 8;v |= v >> 16;v++;对其他宽度的扩展应该是显而易见的。
next = pow(2, ceil(log(x)/log(2)));这可以通过找到将x加2的数字来获得(获得数字的对数(取数字的对数,然后除以所需底数的对数,有关更多信息,请参阅Wikipedia)。然后将其与ceil取整以获得最接近的整数幂。这是比其他地方链接的按位方法更通用的方法(即,速度更慢!),但是很了解数学,对吗?
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;}