У меня возникли проблемы с поиском способа преобразования из 32-битного двоичного числа с двумя дополнениями в десятичное число в java. Я либо получаю ошибку переполнения, либо число выводится неотрицательно, когда оно должно быть отрицательным.
String bin = "11111111111111111111111111111110";
long foo = Long.parseLong(bin);
System.out.println(foo);
Это одна из вещей, которые я пробовал, и я думал, что мне нужно долго использовать, потому что она может содержать до 64 бит. Любая помощь будет большой. благодаря
radix
- основа используемой системы нумерации.
public static void main(String[] args) {
int bits = (int) Long.parseLong("11111111111111111111111111111110", 2);
System.out.println(bits);
}
вывод
-2
Вам нужно предоставить базу или радиус из двух, если вы хотите проанализировать двоичное значение.
long foo = Long.parseLong(bin, 2);
Вы можете увидеть пример на странице документа Java:
parseLong("1100110", 2)
возвращает102L
.
Без радиуса он использует base-10, а 10 32
не вписывается в long
.
Имейте в виду, что для 32-символьной битовой строки это даст вам неподписанный вариант. Если вы хотите, чтобы подписанный вариант был long
, вы можете использовать:
if (foo > 0x7fffffffL) foo = -(0x100000000L - foo);
затем отрегулировать его
Или вы можете принудительно передать его целому числу, если это подходит:
int foo = (int)Long.parseLong(bin,2);
Требование, чтобы Integer.parseInt()
было присвоено знаковое число, означает, что оно не подходит как-для 32-символьных двоичных строк с самым левым 1-битным.
Вы правы - вам нужно использовать "Long" в этом случае.
Поскольку вы делаете два дополнения (не дополнение), вы можете использовать "parseLong()" с радиусом "2":
public class X {
public static void main (String[] args) {
String bin = "11111111111111111111111111111110";
int i = (int)Long.parseLong(bin, 2);
System.out.println("parseInt(" + bin + ", 2)=" + i);
}
}
// Output:
parseInt(11111111111111111111111111111110, 2)=-2
int
.