#java #arrays #for-loop #binary #decimal
#java #массивы #for-цикл #бинарный #десятичный
Вопрос:
Я пытаюсь преобразовать двоичное число (построенное из массива с 0 и 1) в десятичное значение. Каждый раз, когда я запускаю программу, десятичное значение сильно отклоняется. Мне интересно, может ли мой код для десятичного числа внутри цикла быть неправильным? Вот что у меня есть до сих пор:
class Main {
public static void main(String[] args) {
int decimal = 0;
int[] arrayNums = new int[8];
for(int i=0; i<8; i ) {
arrayNums[i] = (int)(Math.random()*2);
System.out.print(arrayNums[i]);
}
for(int i=0; i<8; i ) {
for(int j=7; j>=0; j--) {
decimal = arrayNums[i]*(int)Math.pow(2,j);
}
}
System.out.println();
System.out.print("The decimal value is: " decimal);
}
}
Комментарии:
1. «»десятичное значение неверно — пожалуйста, покажите несколько примеров ввода и вывода и объясните, что вы сделали для отладки кода. Вы выполнили это в своем IDE-отладчике?
2. Вы можете преобразовать свой массив в строку и использовать
Integer.parseInt(string, 2)
. Это также преобразует ваше двоичное число в десятичное число. Например.String string = Arrays.stream(arrayNums).boxed().map(i -> Integer.toString(i)).collect(Collectors.joining())
Ответ №1:
Давайте сохраним ваш существующий код и попытаемся его исправить (я также собираюсь немного почистить ваш синтаксис для хорошего стиля кода).
На данный момент ваш цикл for заполняет ваш массив таким образом, где каждая запись списка является каждой итерацией цикла:
[0, , , , , , , ]
[0,1, , , , , , ]
...
...
...
...
...
[0,1,0,0,0,0,0,1]
Помните, что когда i=0
мы находимся в самом значащем бите, это означает, что он имеет десятичное значение 128.
Когда вы читаете этот массив со вторым циклом for, вы фактически начинаете с самого значащего бита, но повышаете его до 0-й степени вместо 7-й степени. Вот почему ваши ответы неверны. Давайте вместо этого увеличим его до 7-i
мощности.
class Main
{
public static void main(String[] args)
{
int n = 0;
int decimal = 0;
int[] arrayNums = new int[8];
for(int i=0; i<8; i )
{
arrayNums[i] = (int)(Math.random()*2);
System.out.print(arrayNums[i]);
}
for(int i=0; i<8; i )
{
decimal = arrayNums[i]*(int)Math.pow(2,7-i);
}
System.out.println("nThe decimal value is: " decimal);
}
}
ps.
Это n
просто escape-символ, который сообщает окну консоли напечатать новую строку. Это только для форматирования.
Комментарии:
1. Спасибо за вашу помощь! Это имеет гораздо больше смысла.
Ответ №2:
Вы слишком усложняете цикл преобразования. Попробуйте сделать это так. Умножьте предыдущее значение в десятичной системе счисления на 2, затем добавьте бит. Каждое умножение сдвигает значение влево на 1 бит. Вам не нужен метод Math.pow(), поскольку он работает автоматически по мере ввода "shift"
значения. Я предлагаю вам попробовать это на бумаге, чтобы увидеть, как это работает, чтобы убедиться, что вы это понимаете.
int decimal = 0;
for (int i = 0; i < 8; i ) {
decimal = decimal * 2 arrayNums[i];
}