显示大于等于整数的2的最小幂的代码

Posted

技术标签:

【中文标题】显示大于等于整数的2的最小幂的代码【英文标题】:Code for displaying the smallest power of 2 greater than or equal than the integer 【发布时间】:2009-09-23 00:17:37 【问题描述】:

我需要一个 Java 代码,它可以找到大于或等于用户输入的任何非负整数的 2 的最小幂。有人可以帮忙吗?

【问题讨论】:

Eclipse 是一种编程语言?哦哦。 Eclipse是一个IDE是什么语言?加上这闻起来像是一个家庭作业问题。你试过什么? 我想在 Visual Studio 中查看解决方案。 对不起,它要求我用一些东西来标记它,所以我只选择了 Eclipse。该语言是 Java,老实说,除了提示输入整数并确保它是正数之外,我真的不知道从哪里开始。 【参考方案1】:
i>1 ? Integer.highestOneBit(i-1)<<1 : 1

显然存在整数溢出问题(int 中对于大约一半的正数 ints 没有严格正确的解决方案)。

通常的免责声明:未经测试或编译。

【讨论】:

为什么不使用 Long.highestOneBit? 嗯,你可以这样做,但如果你从 int 开始,你可能还是想要一个 int 结果。对于long,您也不能这样做。任意精度整数 ftw!【参考方案2】:

查看此链接

Algorithm for finding the smallest power of two that’s greater or equal to a given value

再见。

【讨论】:

【参考方案3】:
int nextPow2(int n) 
  if (n <= 1) return n;
  double d = n - 1;
  return 1 << ((Double.doubleToRawLongBits(d) >> 52) - 1022);

我在桌面上找到的最快的解决方案。

【讨论】:

【参考方案4】:

大于等于a的2的最小幂

     // Next higher power of 2 greater than or equal to a
     public static int nextPow2(int a) 
            int r0, r1, r2, r3, r4;
            r0 = 2 * highestOneBit(a - 1);
            r1 = highestOneBit(a - 1) << 1;
            r2 = (int) pow(2, ceil(log(a) / log(2)));
            r3 = (int) pow(2, ceil(log10(a) / log10(2)));
            r4 = (int) pow(2, 32 - numberOfLeadingZeros(a - 1));
            return r0; // or r1 or r2 or r3 or r4
        

大于或等于a的2的最小幂的指数

    // Exponent of next higher power of 2 greater than or equal to a
    public static int nextpow2(int a) 
        int r0, r1, r2;
        r0 = (int) ceil(log(a) / log(2));
        r1 = (int) ceil(log10(a) / log10(2));
        r2 = (int) 32 - numberOfLeadingZeros(a - 1); // ceil(log2(x)) = 32 - numberOfLeadingZeros(x - 1)
        return r0; // or r1 or r2
    

【讨论】:

【参考方案5】:
if (i==0) return 1;
else if (i==1) return 2;
else if (i==2 || i==3) return 4;
else if (i==4 || i==5 || i==6 || i==7) return 8;
else if (...)

【讨论】:

【参考方案6】:

你可以通过计算无符号右移的次数来做到这一点,直到结果为零

【讨论】:

以上是关于显示大于等于整数的2的最小幂的代码的主要内容,如果未能解决你的问题,请参考以下文章

已知一个升序数组arr,和一个整数num,找出大于等于num的数的最小索引。即最左的索引。

leetcode剑指 Offer II 008. 和大于等于 target 的最短子数组

刷题日记和大于等于target的最短子数组

刷题日记和大于等于target的最短子数组

刷题日记和大于等于target的最短子数组

x1+x2+x3+x4=10的整数解的个数有多少 其中x1大于等于3,X2大于等于1,X3大于等于0,X4大于等于5