2015-10-22 54 views
1

我想用0和1將字符串轉換爲有符號的短符號。這項工作,但負數我有錯誤的價值觀。我認爲,問題是從無符號轉換爲有符號。如何解決這個問題? 實施例: 971是971, 425是425, -122是3974, -394是3702, -2032是2064使用位集轉換帶符號的短符號

bitset<12> b(binary);//binary is string of 0 and 1 
cout<<(signed short)b.to_ulong()<<"\n"; 
+0

你是什麼意思負值? – Amit

+0

@Amit我把例子,當我有不同的數字。我看到,當我轉換負數時會發生變化。 –

+0

我不理解你的評論。顯示你的代碼不符合你的期望。 – Amit

回答

1

在16位有符號整數,負數表示爲:

1xxx xxxx xxxx xxxx 

正數爲:

0xxx xxxx xxxx xxxx 

例子:

0000 1111 1000 0110 => 3974 

你需要的是一個12位整數,負數表示爲:

.... 1xxx xxxx xxxx 

例子:

.... 1111 1000 0110 => -122 

你可以做這樣的事情:

#include <iostream> 
#include <bitset> 
#include <string> 

using namespace std; 

struct C { 
    signed short b : 12; // 12 bit integer 
}; 

int main() { 
    string binary = "111110000110"; // 3974 
    bitset<12> b(binary); 

    struct C c = { static_cast<signed short>(b.to_ulong()) }; 

    cout << c.b << "\n"; // prints -122 
} 
1

你所得到的值是用於從12的鑄造正確位有符號整數到一個12位無符號整數。

例如,作爲帶符號的12位整數的-122將以二進制表示爲111110000110,這也是3974的二進制表示形式,作爲無符號的12位整數。

你在期待什麼?

編輯

我現在看到你正試圖轉換到短簽訂輸出。考慮一個短的是16位而你的位是12位填充到一個無符號長。函數to_ulong不執行符號擴展(它沒有上下文使它能夠確定符號擴展是否必要,從而清除比特集中表示的最重要的比特),因此你得到了你的比特模式代表它是一個無符號數字。

相關問題