首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何找到与给定输入最接近的2^N值?

如何找到与给定输入最接近的2^N值?
EN

Stack Overflow用户
提问于 2012-01-23 07:18:17
回答 9查看 2.6K关注 0票数 1

我必须以某种方式保持我的程序运行,直到指数函数的输出超过输入值,然后将其与指数函数的前一个输出进行比较。即使是在伪代码中,我如何做这样的事情呢?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-01-23 07:25:12

  1. 从给定数字=> x :=

(2,input )中找到以2为底的对数

  1. 向上和向下取整步骤1中获得的值=> y := round(x),z := round(x) + 1
  2. Find 2^y,2^z,将它们与输入进行比较,选择更适合

的值

票数 5
EN

Stack Overflow用户

发布于 2012-01-23 07:46:11

除了循环之外,还有一种解决方案可能更快,这取决于编译器如何映射nlz指令:

代码语言:javascript
运行
复制
public int nextPowerOfTwo(int val) {
   return 1 << (32 - Integer.numberOfLeadingZeros(val - 1)); 
}

没有显式的循环,而且肯定比使用Math.pow的解决方案更有效。如果不看一下编译器为numberOfLeadingZeros生成的代码,就很难说更多了。

这样,我们就可以很容易地得到2的较低的幂,然后比较哪一个更接近-在我看来,每个解决方案的最后一部分都必须完成。

票数 2
EN

Stack Overflow用户

发布于 2012-01-23 07:49:47

根据您使用的是哪种语言,您可以使用按位操作轻松完成此操作。您需要输入值中单个1位设置为大于输入值中最高一位设置的值,或者输入值中设置为最高一位的值。

如果您确实将最高设置位以下的所有位都设置为1,则添加1将得到下一个更大的2的幂。你可以右移这个来得到两个的下一个较低的幂,然后选择两个中更接近的一个。

代码语言:javascript
运行
复制
unsigned closest_power_of_two(unsigned value)
{
    unsigned above = (value - 1); // handle case where input is a power of two
    above |= above >> 1;          // set all of the bits below the highest bit
    above |= above >> 2;
    above |= above >> 4;
    above |= above >> 8;
    above |= above >> 16;
    ++above;                      // add one, carrying all the way through
                                  // leaving only one bit set.

    unsigned below = above >> 1;  // find the next lower power of two.

    return (above - value) < (value - below) ? above : below;
}

有关其他类似的技巧,请参阅Bit Twiddling Hacks

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8965603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档