我正在学习Java
的基础知识,但有一点观察不太明白。
以下代码应该打印一个base10
数的二进制表示。虽然没有错误或警告,但是我仍在寻找答案以解决逻辑上的异常。
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;
public class Main
{
private static final Scanner scanner = new Scanner(System.in);
public static void main(String args[]) {
int n = scanner.nextInt();
scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
int remainder, quotient, i=0;
int[] binary=new int[n];
/* Binary division -Extracting the 1's and 0's out of the base10 number and storing it in binary[] */
while(n!=0){
remainder=n%2;
quotient=n/2;
binary[i]=remainder;
n=quotient;
i++;
}
int k=i; // For storing the length of array till I want my bits to be reversed since all other bits are initialized to 0.
/*Reversing the binary[] to get the coreect binary value.*/
for(int j=0; j<=i; j++){
int temp=binary[j];
binary[j]=binary[i];
binary[i]=temp;
i--;
}
/*Printing out all the bits of binary number. */
for(int l=1;l<=k;l++){
System.out.print(binary[l]);
}
System.out.println(binary); /*Prints a garbage looking value: For ex- for 25 i get: [I@33909752 */
scanner.close();
}
}
我的代码存在的问题:
1. 当我尝试打印数组变量 - binary
时,出现了一些看起来像垃圾的随机文字。我无法理解可能的原因是什么。这种情况是否正常?如果是,它代表什么意思?
例如:
在我的代码中,当我输入 25
时,打印 binary
变量时会得到 [I@33909752
,而不是我期望的像 [1,1,0,0,1,0,....,0]
这样的结果。
2. 如果我从 0
而不是 1
开始循环打印 binary
值,我会得到多一个前置的 0
。
例如:
for(int l=1;l<=k;l++)
{
System.out.print(binary[l]);
}
当我将循环从25
开始时,输出11001
,但如果我从0
开始循环,输出则为011001
。我在代码中的其他地方添加了SOPLn语句并检查了数组的所有位置,但没有地方会导致数组的0
索引变成0。我想知道为什么?
java
将数组的大小保持在所需的大小来摆脱它们。我有Python背景,其中程序员有自由指示lists
为可接受的大小,因此我想知道我们是否可以在Java中做类似的事情? - mishsxList
(例如java.util.ArrayList
),或者只需用正确长度的新数组替换原数组,即在while
循环后使用binary = Arrays.copyOf(binary, i);
。或者您可以使用32 - Integer.numberOfLeadingZeros(n)
来预测正确的数组大小。 - Holger