二进制字符串到整数转换器中的错误

Error in binary String to Integer converter

我在我的代码中实现了二进制 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;
}
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);

你的代码没有任何问题,除了 int 类型只能容纳这么多。 Int 包含 4 个字节,即 8bitsx4 = 32 位,第一个保留为符号,如果为 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

希望这个测试结果对您有所帮助。 它非常明确地向您展示了正在发生的事情。

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

我认为您对有符号整数值有疑问,因此应该按如下方式将适当的字符(我认为是最后一个)视为符号位。

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()创建一个无符号二进制字符串。

您遇到转换问题:

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

因此 language specification 的以下部分描述了从 doubleint 的转换:

The value must be too large (a positive value of large magnitude or positive infinity), and the result [...] is the largest representable value of type int [...].

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