无法从整数填充二进制数数组
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 次,而不是直到 inputtedNumber
是 0:
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.replace
将 0
替换为 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=] "));
这是分配给我们的问题:
九枚硬币被放置在一个 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 次,而不是直到 inputtedNumber
是 0:
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.replace
将 0
替换为 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=] "));