首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修复以二进制数计算幂的方法,但经常失败?

如何修复以二进制数计算幂的方法,但经常失败?
EN

Stack Overflow用户
提问于 2019-10-16 04:59:49
回答 4查看 69关注 0票数 2

我一直在涂鸦这段小代码,它应该计算并打印出哪些2的幂被总结成一个给定的数字。它可以很好地处理小的奇数,但当我想要它计算偶数或更大的数字时,它就会丢失。

我甚至不知道我可以尝试什么,代码看起来不错,但我可能总是没有注意到。

代码语言:javascript
复制
System.out.println("Give a number");
    int gigaInt = si.nextInt();
    String  gigaBit = Integer.toBinaryString(gigaInt);
    String[] gigaBitArray = gigaBit.split("");

 System.out.println("Binary: " + gigaBit);

 List<Integer> powers = new ArrayList<Integer>();


 for(int counter = gigaBitArray.length-1; counter >= 0; counter--){
        if (gigaBitArray[counter].equals("1"))
            powers.add((int)Math.pow(2,counter));
        else if(gigaBitArray[counter].equals("0")){
            powers.add(0);

        }



    }


    System.out.println("Powers: " + powers);

所以,很明显,程序应该计算功率,它确实是这样做的!在某些情况下...在这里,当给定9时

给出一个数字9二进制: 1001幂: 8,0,0,1

但是当我想要它计算一个偶数时,它总是显示"1“作为唯一的组成部分,如下所示:

给出一个数字8二进制: 1000次方: 0,0,0,1

每当被要求处理一个大数字时,它就会变得完全疯狂:

给出一个数542Binary: 1000011110幂: 0,256,128,64,32,0,0,0,0,1

对于这方面的任何建议,我都会非常感激。这可能只是一种幼稚的错误,所以请一定要指出。

EN

回答 4

Stack Overflow用户

发布于 2019-10-16 05:13:45

根据Dawood ibn Kareem的评论,您首先测试的是低位比特。如果你想先列出高阶幂,你需要一个索引变量和一个幂变量。而且,不需要检查"0“。如果不是"1“,那么它一定是"0”。

代码语言:javascript
复制
int iIndex;
int iLength = gigaBitArray.length; 
int iPower = iLength - 1;

for ( iIndex = 0; iIndex < iLength; ++iIndex, --iPower )
{
    if ( gigaBitArray[iIndex].equals("1") )
    {
        powers.add((int)Math.pow(2, iPower));
    }
    else
    {
        powers.add(0);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-10-16 05:14:59

您的代码的问题在于您正在查看的数组索引。当你输入数字8时,它的二进制表示是1000。当你把它拆分成一个数组时,你会得到:

索引:0 1 2 3值:1 0 0 0

因为您是从列表的末尾开始,所以索引0将在最后处理(并且将与2^0相同)。

要解决这个问题,您只需颠倒正在查看的元素的顺序,同时保持for循环的顺序不变。例如:代替:

代码语言:javascript
复制
gigaBitArray[counter]

它应该是:

代码语言:javascript
复制
gigaBitArray[gigaBitArray.length -1 - counter]
票数 1
EN

Stack Overflow用户

发布于 2019-10-16 05:27:58

除了上面的两个答案外,您还可以通过将0s和1s相乘来消除if else:

代码语言:javascript
复制
int len = gigaBitArray.length;
for (int i = 0; i < gigaBitArray.length; i++) {
     powers.add((int)Math.pow(2, --len)*Integer.parseInt(gigaBitArray[i]));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58402569

复制
相关文章

相似问题

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