我想编写一个函数,该函数返回2的最接近的下一个幂。例如,如果我的输入为789,则输出应为1024。是否有任何方法可以在不使用任何循环而仅使用一些按位运算符的情况下实现这一目标?
3 回答
Qyouu
TA贡献1786条经验 获得超11个赞
检查位扭曲黑客。您需要获取以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++;
对其他宽度的扩展应该是显而易见的。
慕尼黑8549860
TA贡献1818条经验 获得超11个赞
next = pow(2, ceil(log(x)/log(2)));
这可以通过找到将x加2的数字来获得(获得数字的对数(取数字的对数,然后除以所需底数的对数,有关更多信息,请参阅Wikipedia)。然后将其与ceil取整以获得最接近的整数幂。
这是比其他地方链接的按位方法更通用的方法(即,速度更慢!),但是很了解数学,对吗?
收到一只叮咚
TA贡献1821条经验 获得超4个赞
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;
}
- 3 回答
- 0 关注
- 422 浏览
添加回答
举报
0/150
提交
取消