Java 如何修复以二进制数计算幂的方法,但失败的频率更高?
我一直在用这段小代码涂鸦,这段代码是用来计算并打印出2的哪些幂被总结成一个给定的数字。它适用于小奇数,但当我想要它计算偶数或更大的数时,它会丢失 我甚至不知道我可以尝试什么,代码看起来不错,但我可能一直没有注意到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
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]