为了账号安全,请及时绑定邮箱和手机立即绑定

四舍五入到2的下一个幂

四舍五入到2的下一个幂

C
jeck猫 2019-10-15 15:30:12
我想编写一个函数,该函数返回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++;

对其他宽度的扩展应该是显而易见的。


查看完整回答
反对 回复 2019-10-15
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

next = pow(2, ceil(log(x)/log(2)));

这可以通过找到将x加2的数字来获得(获得数字的对数(取数字的对数,然后除以所需底数的对数,有关更多信息,请参阅Wikipedia)。然后将其与ceil取整以获得最接近的整数幂。


这是比其他地方链接的按位方法更通用的方法(即,速度更慢!),但是很了解数学,对吗?


查看完整回答
反对 回复 2019-10-15
?
收到一只叮咚

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;


}


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 422 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信