我想用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和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";
在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
}
你所得到的值是用於從12的鑄造正確位有符號整數到一個12位無符號整數。
例如,作爲帶符號的12位整數的-122將以二進制表示爲111110000110,這也是3974的二進制表示形式,作爲無符號的12位整數。
你在期待什麼?
編輯
我現在看到你正試圖轉換到短簽訂輸出。考慮一個短的是16位而你的位是12位填充到一個無符號長。函數to_ulong不執行符號擴展(它沒有上下文使它能夠確定符號擴展是否必要,從而清除比特集中表示的最重要的比特),因此你得到了你的比特模式代表它是一個無符號數字。
你是什麼意思負值? – Amit
@Amit我把例子,當我有不同的數字。我看到,當我轉換負數時會發生變化。 –
我不理解你的評論。顯示你的代碼不符合你的期望。 – Amit