2014-09-05 3 views
0

Я пытаюсь преобразовать двоичную строку 1111111 11111111 11111111 11111111 (как значение знака 32-разрядного номера) в int, где ответ должен быть -2147483648, он возвращает -1073741822. Есть ли способ адаптировать значение min и max при преобразовании строки в int, чтобы получить правильный ответ?Установка максимального значения для преобразования строки в двоичный код

public static int binaryStringToInt(String s) { 
     int result = 0; 
     boolean negative = false; 
     int i = 0, 
     max = s.length(); 
     int radix = 2; 
     int digit; 
     // int maxLimit = 2147483647 ? 
     // int minLimit = -2147483648 ? 

     if (s.charAt(0) == '1') { 
      negative = true; 
      i++; 
     } 

     if (i < max) { 
      digit = Character.digit(s.charAt(i++),radix); 
      result = -digit; 
     } 

     while (i < max) { 
      digit = Character.digit(s.charAt(i++),radix); 
      result *= radix; 
      result -= digit; 
     } 

     if (negative) return result; 
     return -result; 

    } 

Спасибо!

+2

получить двоичное строковое представление Integer.MAX – Cruncher

+1

В подсказке. .. Ответ, который вы получаете, составляет почти половину того, что должно быть. –

+1

Бинарное представление '-2147483648' -' 1000_0000_0000_0000_0000_0000_0000_0000', поэтому я не уверен, что понимаю, чего вы пытаетесь достичь. – ajb

ответ

-1

В binaryStringToInt() мне нужно изменить от

if (s.charAt(0) == '1') { 
    negative = true; 
    i++; 
} 

в

if (s.charAt(0) == '1') { 
    negative = true; 
    // i++; - was not counting the first char as part of the number 
} 
0

Попробуйте это:

// Do calculations in long 
long maxLimitMagnitude = 2147483647L; 
long minLimitMagnitude = 2147483648L; 
long magnitude   = 0L; 

// Decide first if number is positive or negative 
boolean negative = (s.charAt(0)=='1' ? true : false); 

// Accumulate magnitude from left to right starting with second digit 
for (int i=1; i<s.length(); i++) 
{ 
    magnitude<<= 1;  // or *= radix for the general case (radix other than 2) 
    magnitude+= Character.digit(s.charAt(i), radix); 
} 

// make sure the magnitude will fit in a 2s complement int 
if (magnitude> (negative ? minLimitMagnitude : maxLimitMagnitude)) 
    throw new ArithmeticOverflowException(); // your own exception class 

return (int)(negative ? -magnitude : magnitude); 
+0

Удивительное спасибо! Поэтому для переполнения, когда вы пытаетесь поймать, было бы справедливо сказать что-то вроде 'if magnify> minLimitMagnitude return -minLimitMagnitude} else {return maxLimitmagnitude}'. Если бы вы сказали, что везде, где происходит переполнение, это только верхняя или нижняя граница? – user2958542

Смежные вопросы