使用bitset转换signed short

时间:2015-10-22 07:38:41

标签: c++ bitset

我希望将0和1的转换字符串转换为short。这项工作,但负数我有错误的价值观。我认为,问题是从无签名转换为签名。怎么解决这个问题? 例: 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";

2 个答案:

答案 0 :(得分:1)

对于从12位有符号整数到12位无符号整数的转换,您获得的值是正确的。

例如,作为带符号的12位整数的-122将以二进制表示为111110000110,这也是3974的无符号12位整数的二进制表示。

你在期待什么?

修改

我现在看到你正在尝试转换为签名的输出短路。考虑一个short是16位,而你的bitset是12位填充到unsigned long。函数to_ulong不执行符号扩展(它没有上下文可以使它确定是否需要符号扩展,从而清除超出bitset中表示的最重要的位),因此你得到的是你的位模式代表它是无符号数。

答案 1 :(得分: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
}