无法从整数填充二进制数数组

Having trouble filling an array of binary numbers from an integer

这是分配给我们的问题:

九枚硬币被放置在一个 3x3 的矩阵中,一些面朝上,一些面朝下。您可以使用值为 0(正面)和 1(反面)的 3x3 矩阵表示硬币的状态。以下是一些示例:

0 0 0 1 0 1 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 1

每个状态也可以用二进制数来表示。例如,前面的矩阵对应于数字:

000010000 101001100 110100001

一共有512种可能,所以可以用十进制数0,1,2,3,...,511来表示矩阵的所有状态。

编写一个程序,提示用户输入 0 到 511 之间的数字,并显示对应的矩阵,其中包含字符 H 和 T。

我想要方法 toBinary() 来填充数组 binaryNumbers。我意识到这并没有在左边填充0。我必须仔细考虑,但这是唯一的问题吗?

//https://www.geeksforgeeks.org/java-program-for-decimal-to-binary-conversion/ 
import java.util.Scanner; 
public class HeadsAndTails {

public static void main(String[] args) {

    Scanner input = new Scanner(System.in); 
    int num = input.nextInt(); 
    int[] binaryNumbers = toBinary(num);

    for (int i = 0; i < 9; i++) {

    printArr(binaryNumbers); 
    System.out.print(binaryNumbers[1]); 
}
}

public static int[] toBinary(int inputtedNumber) { 

    int[] binaryNum = new int[9]; 
    int i = 0; 

    while (inputtedNumber > 0) { 

        binaryNum[i] = inputtedNumber % 2; 
        inputtedNumber = inputtedNumber/2; 
        inputtedNumber++; 

    } return binaryNum; 

} 
public static void printArr(int[] arr) { 

    for (int i = 0; i < 9; i++) {

        if (arr[i] == 0) { 

            System.out.print("H "); 

        } else { 

            System.out.print("T "); 

        }

        if (arr[i+1] % 3 == 0) {

            System.out.println(); 

        } System.out.print(arr[i]);

    } 

}
}

看起来您在 while 循环中增加了错误的变量:

while (inputtedNumber > 0) { 

    binaryNum[i] = inputtedNumber % 2; 
    inputtedNumber = inputtedNumber/2; 
    i++; // NOT inputtedNumber

} return binaryNum;

另请注意,new int[9] 可能已经初始化为 0,但如果没有,您可以 循环 9 次,而不是直到 inputtedNumber0:

for (int i = 0; i < 9; i++) { 
    binaryNum[i] = inputtedNumber % 2; 
    inputtedNumber = inputtedNumber/2; 
} 
return binaryNum;

最后,我认为你的数组可能在你完成后是倒序的,所以你可能需要反转它或者以相反的顺序输出它

我知道这是一项家庭作业,因此您应该坚持目前的做法。然而,有时看看使用 Java 的内置功能可以实现什么会很有趣。

Integer class 有一个方法 toBinaryString 这是一个很好的起点:

    int n = 23;
    String s1 = Integer.toBinaryString(n);      
    System.out.println(s1);

输出:10111

但是正如我们所见,这省略了前导 0s。我们可以通过确保我们的数字在第 10 位有一个有效数字来取回这些,使用一点点旋转:

    String s2 = Integer.toBinaryString(1<<9 | n);       
    System.out.println(s2);

输出:1000010111

但现在我们有一个我们不想要的前导 1。我们将使用 String.substring 删除它,同时我们将使用 String.replace0 替换为 H 并将 1 替换为 T:

    String s3 = Integer.toBinaryString(1<<9 | n).substring(1).replace('0','H').replace('1','T');
    System.out.println(s3);

输出:HHHHTHTTT

现在我们可以以矩阵形式打印此字符串,再次使用 substring 提取每一行并使用 replaceAll 插入所需的空格:

    for(int i=0; i<9; i+=3)
        System.out.println(s3.substring(i, i+3).replaceAll("", " ").trim());

输出:

H H H
H T H
T T T

如果我们想要一些正则表达式魔法(找到 here and here),我们可以做得更好:

    for(String sl : s3.split("(?<=\G.{3})"))
        System.out.println(sl.replaceAll(".(?=.)", "[=15=] "));

把它们放在一起我们得到:

    int n = 23;
    String s3 = Integer.toBinaryString(1<<9 | n).substring(1).replace('0','H').replace('1','T');
    for(String s : s3.split("(?<=\G.{3})"))
        System.out.println(s.replaceAll(".(?=.)", "[=16=] "));