当前位置: 首页 > 面试题库 >

Java指数错误,功率为2 ^ 31

翟鹏
2023-03-14
问题内容

我正在编写一个Java程序来输出2的指数幂(顺便说一句,我不能使用Math.pow()),但是在2 ^ 31和2 ^
32处我得到了其他东西。另外,我不打算接受负整数。

我的代码

class PrintPowersOf2 {
    public static void main (String[] args) {
        printPowersOf2(10);
        printPowersOf2(5);
        printPowersOf2(2);
        printPowersOf2(-5);
        printPowersOf2(30);
        printPowersOf2(32);
    }

    public static void printPowersOf2 (int x) {
        for(int i=0;i<x+1;i++) {
            int y = exponent (i);
            System.out.print(y);
            if(!(i == x)) {
                System.out.print(" ");
            }
        }
        System.out.println();
    }

    static int exponent(int power) {
        int output = 1; 
        for (int z=0; z<power; z++) 
        output *= 2; 
        return output; 
    }
}

我得到的输出是:

1 2 4 8 16 32 64 128 256 512 1024
1 2 4 8 16 32
1 2 4

1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 1073741824

1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 1073741824 -2147483648 0

问题答案:

An int用32位表示。因此-2^312^31-1可以表示和之间的任何值。没有什么超出这个范围。

您可以使用long(64位)或BigInteger(可以表示直到内存限制的所有数字的数据结构)。

使用这些结构的缺点(尤其是BigInteger)是CPU并不总是提供算术指令。因此,添加两个BigInteger实例比使用intor
进行操作需要更多的时间long。如果是long,如果CPU是32位,则至少需要两条指令来处理。

在旁注。CPU提供了一种更好的方法来计算两者的幂:移位运算。

您可以简单地写:

long value = 0x01L << power;//power of two, all in one simple instruction.

其工作原理如下:移位将位向左移动。因此,如果原始值为:

  0001 1011 << 2
= 0110 1100

在二进制表示形式中向左移与在数学上等于乘以二相同。



 类似资料:
  • 我有碱基错配的DNA扩增子,这可能会在PCR扩增过程中出现。我感兴趣的是,给定每个碱基的错误率、错配数和扩增子中碱基的数量,序列包含错误的概率是多少。 我偶然看到一篇文章[Cummings,S.M.et al(2010).群体遗传分析中PCR、克隆和测序错误的解决方案.保守遗传学,11(3),1095-1097.DOI:10.1007/S10592-009-9864-6]提出了在这种情况下计算概率

  • 问题内容: 今天,在新构建的计算机上进行的某些测试失败了,而在其他计算机上的测试就可以了。照顾问题表明 ‘java.lang.AssertionError:1999-01-02’中的结果 Jave版本不起作用 (OS Debian 9,Ubuntu 18.04) 在开发人员机器上,工作Java版本在哪里 (作业系统Ubuntu 14.04) 有什么问题?有什么我可以检查的吗? 问题答案: 您很可能

  • 这是一个Lua脚本,用于Corona SDK中的一个游戏。一开始(旧代码)效率很低,我不得不手动创建每道数学题,在其他人的帮助下(新代码),所以我得到了答案。 在控制台中,我现在看到了这个错误:

  • 尝试使用ChromeDriver 2.9运行测试时出现以下错误: 未知错误:无法解析功能: chromeOptionsorg.openqa.selenium.WebDriverExctive:未知错误:无法解析功能: chromeOptions from未知错误:必须是字典(驱动程序信息: chromeDrive=2.9.248315,平台=Windows NT 6.1 SP1 x86)(警告:服

  • 问题内容: 我在这里有用于登录的代码,遇到此错误,“ java.sql.SQLException:未为参数2指定值” 有时,“ java.sql.SQLException:参数索引超出范围(1>参数数量,为0)。” 我真的不知道 } 问题答案: 您正在将用户和密码都分配给相同的参数(1)。 更改此: 对此: