使用 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
}
我想将包含 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
}