使用 bitset 转换带符号的短整型

Convert signed short with bitset

我想将包含 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";

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

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

你期待什么?

编辑

我现在看到您正在尝试转换为带符号的短格式输出。考虑一个 short 是 16 位,而你的 bitset 是 12 位填充到一个 unsigned long 中。函数 to_ulong 不执行符号扩展(它没有上下文可以使它确定是否需要符号扩展,从而清除位集中表示的最高有效位),所以你得到了什么如果它是一个无符号数,你的位模式将代表它。

在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
}