Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复以二进制数计算幂的方法,但失败的频率更高?_Java_Arrays_Binary - Fatal编程技术网

Java 如何修复以二进制数计算幂的方法,但失败的频率更高?

Java 如何修复以二进制数计算幂的方法,但失败的频率更高?,java,arrays,binary,Java,Arrays,Binary,我一直在用这段小代码涂鸦,这段代码是用来计算并打印出2的哪些幂被总结成一个给定的数字。它适用于小奇数,但当我想要它计算偶数或更大的数时,它会丢失 我甚至不知道我可以尝试什么,代码看起来不错,但我可能一直没有注意到 System.out.println("Give a number"); int gigaInt = si.nextInt(); String gigaBit = Integer.toBinaryString(gigaInt); String[] gigaBi

我一直在用这段小代码涂鸦,这段代码是用来计算并打印出2的哪些幂被总结成一个给定的数字。它适用于小奇数,但当我想要它计算偶数或更大的数时,它会丢失

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

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);
System.out.println(“给出一个数字”);
int gigaInt=si.nextInt();
字符串gigaBit=Integer.toBinaryString(gigaInt);
字符串[]gigaBitArray=gigaBit.split(“”);
System.out.println(“二进制:“+gigaBit”);
List powers=new ArrayList();
对于(int counter=gigabitraray.length-1;计数器>=0;计数器--){
if(千兆位阵列[counter].equals(“1”))
加法((int)数学功率(2,计数器));
else if(千兆位数组[counter].equals(“0”)){
加入(0);
}
}
System.out.println(“Powers:+Powers”);
所以,很明显,这个程序是用来计算功率的,确实如此!在某些情况下。。。这里,当给出9

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

但当我想让它计算偶数时,它总是显示“1”作为唯一的分量,如下所示:

给一个数字 8. 二进制:1000 幂:[0,0,0,1]

无论何时被要求处理一个大数字,它都会变得非常疯狂:

给一个数字 542 二进制代码:100001110 幂:[0,256,128,64,32,0,0,0,0,0,1]


我将非常感谢任何关于这方面的建议。这可能只是一种幼稚的错误,所以请务必指出。

根据Dawood ibn Kareem的评论,您首先要测试低阶位。如果您希望首先列出高阶幂,则需要一个索引变量和幂变量。此外,无需检查“0”。如果不是“1”,则必须是“0”

int-iIndex;
int ILENGHT=千兆位数组.length;
int i功率=i长度-1;
对于(iIndex=0;iIndex
代码的问题在于正在查看的数组索引。 输入数字8时,其二进制表示为1000。当您将其拆分为一个数组时,您会得到:

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

由于从列表的末尾开始,索引0将最后处理(与2^0相同)

要解决这个问题,您所需要做的就是反转正在查看的元素的顺序,同时保持for循环的相同顺序。 如: 而不是:

gigaBitArray[counter]
应该是:

gigaBitArray[gigaBitArray.length -1 - counter]

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

int len = gigaBitArray.length;
for (int i = 0; i < gigaBitArray.length; i++) {
     powers.add((int)Math.pow(2, --len)*Integer.parseInt(gigaBitArray[i]));
}
int len=gigaBitArray.length;
对于(int i=0;i
问题在于用于处理二进制数字的索引。请检查以下正确的程序:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner si = new Scanner(System.in);
        System.out.print("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[gigaBitArray.length-counter-1].equals("1"))
                powers.add((int) Math.pow(2, counter));
            else if (gigaBitArray[gigaBitArray.length-counter-1].equals("0")) {
                powers.add(0);
            }
        }
        System.out.println("Powers: " + powers);
    }
}

这里有一种方法。代码中不明显的注释。这里的想法是计算机中的所有信息都是二进制的。字符和数字是根据
上下文打印出来的。因为所有信息都是二进制的,所以可以
向左或向右移动
,以将位字段移动到相同的方向。这允许检测
1
0
位,而无需借助字符串操作的开销

for(整数编号:新整数[]{8,10,23,11,2,4,99
}) {
List powers=new ArrayList();
//开始位移位
int-shift=0;
//保存号码以便打印输出
int save=数字;
而(数量>0){
//将数字与1相加将屏蔽
//低阶位为1或0。
//然后将该位“移位”数字移位
//位(第一次通过为0)和存储
//以p为单位的幂,然后增加#位
//转移。
int p=(数字&1)>=1;
}
System.out.printf(“%3d->%s%n”,保存,电源);
}
上面打印了以下内容:

  8 -> [8, 0, 0, 0]
 10 -> [8, 0, 2, 0]
 23 -> [16, 0, 4, 2, 1]
 11 -> [8, 0, 2, 1]
  2 -> [2, 0]
  4 -> [4, 0, 0]
 99 -> [64, 32, 0, 0, 0, 2, 1]


您似乎是从右端遍历数字,但报告的权力,就好像您是从左端遍历。其效果是反转数字
9=1001
之所以有效,是因为它在两个方向上都是一样的。谢谢!这实际上帮我弄明白了!我刚刚创建了一个int=0,它随着计数器的减少而增加,现在可以工作了!非常感谢。again@KamilBarczak-如果其中一个答案解决了您的问题,您可以通过将其标记为已接受来帮助社区。公认的答案有助于未来的访问者自信地使用解决方案。检查以了解如何做。
Give a number: 19
1 0 0 1 1 Binary: 10011
Powers: [16, 0, 0, 2, 1]
Give a number: 20
1 0 1 0 0 Binary: 10100
Powers: [16, 0, 4, 0, 0]
  8 -> [8, 0, 0, 0]
 10 -> [8, 0, 2, 0]
 23 -> [16, 0, 4, 2, 1]
 11 -> [8, 0, 2, 1]
  2 -> [2, 0]
  4 -> [4, 0, 0]
 99 -> [64, 32, 0, 0, 0, 2, 1]