Здесь нужна помощь:
Мне был поручен проект по преобразованию значений Hex в файле в Decimal с использованием Java без использования методов, доступных в Java, которые могут делать это напрямую (мы должны сделать это долгим путем).
Я успешно преобразовал свои шестнадцатеричные значения в двоичные, но у меня возникли проблемы с преобразованием двоичных строк в десятичные. Вывод неверен; Мне нужна помощь только в этом разделе, поэтому я просто помещаю первое двоичное значение, которое мне нужно преобразовать, чтобы упростить понимание и объяснение. Вот что у меня есть
public class binToDec {
public static void main(String[] args) {
int decimal = 0;
String binary = "101010111100110111101111101010111100";
for (int pow = (binary.length()-1); pow > -1; pow--) {
if (binary.charAt(pow)=='1'){
decimal += (Math.pow(2, pow));
}
}
System.out.print(decimal);
}
}
run: 2147483647 // это неверно. это должно быть 46118402748
Спасибо большое за твою помощь
2 ответа
В вашем коде есть 2 проблемы.
Переполнение, безусловно, происходит, потому что
int
может содержать только значение до 2 ^ 31 - 1, а в вашей строкеbinary
более 31 бита. Объявитеdecimal
long
.long decimal = 0;
Вы применяете показатель степени с неправильного конца цикла при добавлении к
decimal
. Символ0
является наиболее значимым, но вы отправляете показатель степени0
, как если бы он был наименее значимым. Пытатьсяdecimal += (Math.pow(2, (len - pow - 1)));
(Предполагается, что
len
объявлен какint len = binary.length();
.)Использование
Math.pow
может считаться излишним. Вы также можете попробоватьdecimal += 1L << (len - pow - 1);
binary
больше 32 бит».
int
подписаны, поэтому использование этого старшего 32-го бита вызовет переполнение (если он установлен). На самом деле, использование long
просто откладывает проблему, так как это все еще будет иметь проблему переполнения, если в строке binary
представлено более 63 бит.
Это не сработает, потому что int
в Java 32-битный, а ваша двоичная строка там имеет 36 бит. Это приведет к переполнению.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
BinToDec
, а неbinToDec