簡體   English   中英

二進制字符串到整數轉換器的錯誤

[英]Error in binary String to Integer converter

我在代碼中實現了二進制將字符串轉換為整數的方法。 問題是方法輸出結果的后兩位數字錯了,例如:

結果: 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;
}

您的代碼沒有什么錯,除了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

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);

我希望這個測試結果可能會有所幫助。 它清楚地顯示了發生了什么。

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

您遇到轉換問題:

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

因此, 語言規范的以下部分描述了從doubleint的轉換:

該值必須太大(正值大或正無窮大),並且結果是int類型的最大可表示值。

因此,最后添加的值是2^31-1而不是2^31 ,這會導致問題。

我認為您在使用帶符號的整數值時遇到問題,因此應按如下方式處理適當的char(我認為是最后一個)符號位。

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()創建一個無符號的二進制字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM