2010-04-22 45 views
0

我在32位內有一定的18位(二進制補碼)。我需要將它們轉換爲十進制。請給我一個C代碼片段。需要最快的方法來將2的補碼轉換爲C中的十進制數

謝謝!

+0

當你說小數,你的意思是打印基數爲10的數字作爲文本,對嗎? – 2010-04-22 07:56:58

+0

小或大端? – 2010-04-22 07:59:30

+0

@MadsElvheim,十進制數字的意思是'10 base'。 – 2016-01-14 06:28:51

回答

4

首先,你需要做的sign extension你的18位,填寫本地int

const int negative = (smallInt & (1 << 17)) != 0; 
int nativeInt; 

if (negative) 
    nativeInt = smallInt | ~((1 << 18) - 1); 
else 
    nativeInt = smallInt; 

如果數字被認爲是負的(即17位設置),我們按位或將其與在所有其餘位中都有一個。這會創建適當的負值原生大小的整數。

然後,只需打印出本地整數像往常一樣,因爲你聽起來像是你需要一個十進制字符串表示:

char buf[12]; 

snprintf(buf, sizeof buf, "%d", nativeInt); 

當然,這最後一部分可能根本不匹配您的expectaions;這可能不是「最快」的。由於您的輸入範圍有限,只有18位,所以可能會提出一些更優化的內容。

幾個想法:

  1. 刪除緩衝區大小參數(即使用sprintf()),因爲我們可以相當肯定所需的字符的最大數量。
  2. 由於我們知道範圍,因此請使用一般不會檢查範圍之外值的通用事物。
  3. 使用itoa()如果你有它,比s*printf()少一般,所以可能會更快。
+0

符號擴展名:'if(smallInt> =(1 << 17))smallInt - =(1 << 18);'。當然,假設smallInt在開始的正確範圍內,在未使用的高位中有0。 – 2010-04-22 10:54:18

0

我這個嘗試自己和工作得很好:

int binTwosComplementToSignedDecimal(char binary[],int significantBits) 
{ 
    int power = pow(2,significantBits-1); 
    int sum = 0; 
    int i; 

    for (i=0; i<significantBits; ++i) 
    { 
     if (i==0 && binary[i]!='0') 
     { 
      sum = power * -1; 
     } 
     else 
     { 
      sum += (binary[i]-'0')*power;//The -0 is needed 
     } 
     power /= 2; 
    } 

    return sum; 
} 

樣品:

char binary[8] = '10000001'; 
int significantBits = 8; 
int decimal = binTwosComplementToSignedDecimal(binary,significantBits); 

結果

decimal = -127 
相關問題