Integer.parseInt(x, 2) не учитывает бит знака

При выполнении Integer.parseInt(x, 2) не учитывается бит знака.

Возьмите этот пример,

System.out.println(Integer.toBinaryString(-1)); // This output's "11111111111111111111111111111111"
System.out.println(Integer.parseInt(Integer.toBinaryString(-1), 2));

Вторая линия бросает,

Exception in thread "main" java.lang.NumberFormatException: For input string: "11111111111111111111111111111111"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at com.Test.main(Test.java:116)

У меня есть сценарий для преобразования Integer в Binary String, а затем обратно.

Есть ли способ позволить методу parseInt() проанализировать его с битом знака?

РЕДАКТИРОВАТЬ:

Ответ в этом вопросе имеет хакерское решение для использования метода parseXX() на большем тип данных (например: Integer.parseInt(), если нужен короткий, или длинный, если нужен int). Это не сработает, если кто-то пытается проанализировать отрицательное значение long (поскольку нет большего типа, чем long).

Но ответ @Tagir, кажется, работает для всех типов. Так что оставь этот вопрос открытым.


person Codebender    schedule 18.08.2015    source источник
comment
Это не будет работать во всех случаях... можете ли вы привести пример случая, когда это не сработает?   -  person ajb    schedule 18.08.2015
comment
Ваш вопрос касался типов int или Integer, поэтому было далеко не ясно, что все случаи относятся к более крупным типам. И это, безусловно, действительно работает во всех случаях, охватываемых вашей фразой в скобках.   -  person ajb    schedule 18.08.2015


Ответы (4)


Начиная с Java 8 вы можете использовать Integer.parseUnsignedInt(s, 2);:

System.out.println(Integer.parseUnsignedInt(Integer.toBinaryString(-1), 2));
person Tagir Valeev    schedule 18.08.2015
comment
Это отлично работает. Спасибо. - person Codebender; 18.08.2015

Попробуйте использовать

int i = Long.valueOf(str, 2).intValue();

С использованием:

int i = Long.valueOf("11111111111111111111111111111111", 2).intValue();
System.out.print(i);

Выход:

-1
person M. Shaw    schedule 18.08.2015
comment
@ILikeTau Попробуйте запустить его сами. - person M. Shaw; 18.08.2015
comment
Хм… я не видел intValue(). повторного голосования и удаления моего комментария. - person saagarjha; 18.08.2015

"11111111111111111111111111111111" слишком долго

System.out.println(Integer.toBinaryString(-1)); 
// This output's "11111111111111111111111111111111"
System.out.println(Long.parseLong(Integer.toBinaryString(-1), 2));
person lie    schedule 18.08.2015
comment
Это не работает, поскольку возвращает дополнение до двух, которое не фиксируется с помощью Long. - person saagarjha; 18.08.2015
comment
@ILikeTau Однако приведение полученных результатов от long к int должно работать. - person ajb; 18.08.2015
comment
Да, но в ответе этого не было. Кроме того, использование методов Integer при работе с ними кажется более элегантным. - person saagarjha; 18.08.2015

Согласно Integer API, Integer.toBinaryString() возвращает дополнение до двух, а не подписанная версия. Вот почему это выдает NumberFormatException. Вместо этого вы можете использовать Integer.parseUnsignedInt().

person saagarjha    schedule 18.08.2015
comment
Я. Но есть ли способ правильно разобрать его без исключения? - person Codebender; 18.08.2015
comment
Используйте 1_. - person saagarjha; 18.08.2015