0
A
回答
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位,所以可能會提出一些更優化的內容。
幾個想法:
- 刪除緩衝區大小參數(即使用
sprintf()
),因爲我們可以相當肯定所需的字符的最大數量。 - 由於我們知道範圍,因此請使用一般不會檢查範圍之外值的通用事物。
- 使用
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
相關問題
- 1. 使用16位將十進制數轉換爲2的補碼
- 2. 有沒有一種算法來手動將二進制的十六進制補碼轉換爲十進制數?
- 3. 用於將十進制數轉換爲其補碼的輸出
- 4. 從十六進制轉換爲2的補碼
- 5. 快速2的補碼減法/加法十六進制
- 6. 轉換十進制轉換爲二進制補碼
- 7. 將十進制轉換爲二進制補碼,溢出
- 8. 將二進制補碼轉換爲十進制
- 9. 將十六進制(二進制補碼)轉換爲Java值
- 10. 如何在python中將十進制轉換爲補碼十六進制
- 11. 將小數轉換爲2的補碼
- 12. 將帶符號的十進制轉換爲使用二進制補碼編碼的十六進制
- 13. 將數字轉換的二進制補碼形式有符號的十進制
- 14. C#將補碼比特轉換爲2的補碼長度?
- 15. 將excel中的Unicode十六進制數轉換爲十進制
- 16. 將十進制轉換爲十六進制的C++程序
- 17. 十進制數的二進制補碼
- 18. 將字符串轉換爲二進制的最快方法?
- 19. 將八進制數轉換爲十進制數的算法?
- 20. 在C++中將字節數組轉換爲十六進制字符串的最快方法是什麼?
- 21. 使用java將32位二進制補碼轉換爲十進制數
- 22. 將十六進制轉換爲二進制和16位二進制補碼
- 23. C#將十進制數轉換爲二進制的程序
- 24. 將C十進制轉換爲無數組的二進制
- 25. c中的十進制轉換爲int#
- 26. 將十六進制字符串轉換爲c中的十進制數
- 27. 將十進制/十六進制數轉換爲C中的時間戳
- 28. 在Visual C++中將十進制值轉換爲十六進制
- 29. 如果需要將距離從十進制轉換爲整數
- 30. C++中的2的補碼轉換器
當你說小數,你的意思是打印基數爲10的數字作爲文本,對嗎? – 2010-04-22 07:56:58
小或大端? – 2010-04-22 07:59:30
@MadsElvheim,十進制數字的意思是'10 base'。 – 2016-01-14 06:28:51