Convert signed short with 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";
在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位无符号整数的转换,您得到的值是正确的。
例如,-122作为一个有符号的12位整数,在二进制中表示为111110000110,这也是3974作为一个无符号的12位整数的二进制表示。
你在期待什么?
编辑
我现在看到您正在尝试将输出转换为有符号短格式。考虑到short是16位,而bitset是12位填充到unsigned long中。to_ulong函数不执行符号扩展(它没有上下文使它能够确定是否需要符号扩展,从而清除bitset中表示的最有效位),因此您得到的是您的位模式所代表的无符号数。
相关文章:
- Problems with std::cin.fail()
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- Boost.TEST with CLion: "Test framework quit unexpectedly"
- 避免碎片化的ClientHellos with OpenSSL (DTLS)
- Issues with Win32 ReadProcessMemory API
- Qt with WinAPI MouseProc
- [[maybe_unused]] with structured_binding?
- Issue with WriteProcessMemory
- OpenCV RTP-Stream with FFMPEG
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- std::adjacent_difference with std::chrono time_point
- 如何打印大于"无符号长长"的"std::bitset"的十进制值?
- DLL Made with CMake 使程序崩溃
- QtCreator with C 库中的链接器问题
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- specialized std::default_delete with QQmlComponent
- 关于 std::bitset 构造函数的几个问题?
- working with std::bitset
- Convert signed short with bitset