二进制字符串到整数转换器出错

时间:2015-05-22 23:24:02

标签: java string algorithm parsing binary

我的代码中实现了二进制String To Integer方法。问题是我在方法输出结果的最后两位数上出错了,例如:

应该是结果: 11111111100001001000101110000100

结果: 11111111100001001000101110000011

结果的最后两位数总是有问题。

非常感谢任何帮助。

代码:

public static int binaryStringToInteger (String binaryString){
char[] digits = binaryString.toCharArray();
int binaryInteger = 0;
int count = 0;
for(int i=digits.length-1;i>=0;i--)
  {
    if(digits[i]=='1') 
         {
          binaryInteger +=(int)Math.pow(2, count);
         }
    count++;
  }
 return binaryInteger;
}

5 个答案:

答案 0 :(得分:2)

你的代码没有任何问题,除了int类型只能容纳这么多。 Int保存4个字节,即8bitsx4 = 32位,第一个保留用于sign,负数为1,正数为0。 尝试使用包含64位的long int:

public static long binaryStringToInteger (String binaryString){
    char[] digits = binaryString.toCharArray();
    long binaryInteger = 0;
    int count = 0;
    for(int i=digits.length-1;i>=0;i--)
      {
        if(digits[i]=='1') 
             {
              binaryInteger +=(long)Math.pow(2, count);
             }
        count++;
      }
     return binaryInteger;
    }

同时检查:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

答案 1 :(得分:1)

public static long binaryStringToInteger (String binaryString){
char[] digits = binaryString.toCharArray();
long binaryInteger = 0;
long count = 0;
for(int i=digits.length-1;i>=0;i--)
{
    if(digits[i]=='1') 
     {
      binaryInteger +=(long)Math.pow(2, count);
     }
count++;
}
 return binaryInteger;
}

转换binaryInteger时:

Long.toBinaryString(binaryInteger);

答案 2 :(得分:1)

我希望这个测试结果可能会有所帮助。 它向您展示了最新的内容。

binStr = 1 int = 1
binStr = 11 int = 3
binStr = 111 int = 7
binStr = 1111 int = 15
binStr = 11111 int = 31
binStr = 111111 int = 63
binStr = 1111111 int = 127
binStr = 11111111 int = 255
binStr = 111111111 int = 511
binStr = 1111111111 int = 1023
binStr = 11111111111 int = 2047
binStr = 111111111111 int = 4095
binStr = 1111111111111 int = 8191
binStr = 11111111111111 int = 16383
binStr = 111111111111111 int = 32767
binStr = 1111111111111111 int = 65535
binStr = 11111111111111111 int = 131071
binStr = 111111111111111111 int = 262143
binStr = 1111111111111111111 int = 524287
binStr = 11111111111111111111 int = 1048575
binStr = 111111111111111111111 int = 2097151
binStr = 1111111111111111111111 int = 4194303
binStr = 11111111111111111111111 int = 8388607
binStr = 111111111111111111111111 int = 16777215
binStr = 1111111111111111111111111 int = 33554431
binStr = 11111111111111111111111111 int = 67108863
binStr = 111111111111111111111111111 int = 134217727
binStr = 1111111111111111111111111111 int = 268435455
binStr = 11111111111111111111111111111 int = 536870911
binStr = 111111111111111111111111111111 int = 1073741823
binStr = 1111111111111111111111111111111 int = 2147483647
binStr = 11111111111111111111111111111111 int = -2
binStr = 111111111111111111111111111111111 int = 2147483645
binStr = 1111111111111111111111111111111111 int = -4

答案 3 :(得分:1)

您遇到转换问题:

2^31 > 2^31-1 = Integer.MAX_VALUE

因此,language specification中的以下部分介绍了从doubleint的转换:

  

值必须太大(大幅度或正无穷大的正值),结果[...]是int [...]类型的最大可表示值。

因此,最后添加的值为2^31-1而不是2^31会导致问题。

答案 4 :(得分:0)

我认为你有一个有符号整数值的问题,所以应该按照以下方式处理适当的字符(我认为最后一个)符号位。

public static int binaryStringToInteger (String binaryString){
    char[] digits = binaryString.toCharArray();
    int binaryInteger = 0;
    int count = 0;
    for(int i=digits.length-2; i>=0;i--)
    {
        if(digits[i]=='1') 
        {
             binaryInteger +=(int)Math.pow(2, count);
        }
        count++;
    }
    if(digits[digits.length-1] =='1') 
    {
        binaryInteger *= -1 ;
    }

    return binaryInteger;
}

Integer.toBinaryString()也会创建一个无符号二进制字符串。