Bor*_*ris 2 c++ bit-manipulation twos-complement
我有一个无符号整数(32 位),其中存储了一个 n 位有符号数(2 的补码,因此 -16 \xe2\x89\xa4 x < 16,并且生成的无符号值在 0- 范围内) 15)。
\n如何使用二进制补码将其有效地转换为带符号的解释?
\n一个简短的例子来阐明我的意思:
\nint numUnsigned = 15; // Store a 4-bit value 0b1111\nint numSigned = ???; // Convert to 4-bit signed value using two's complement\n// Now numSigned should be -1, since 0b1111 == -1\nRun Code Online (Sandbox Code Playgroud)\n我整个早上都在搞乱这些东西,但似乎无法把它弄好。
\n如果我正确理解你的问题,你只需要一个符号扩展,而不是 2 的互补(至少根据你在第二行代码中的评论)。
如果我是正确的,您可以执行以下操作(假设您有 N 位数字,0 < N < 32):
unsigned msb_mask = 1 << (N-1); // setup a mask for most significant bit
numSigned = numUnsigned;
if ((numSigned & msb_mask) != 0) // check if the MSB is '1'
{
numSigned |= ~(msb_mask-1); // extend the MSB
}
Run Code Online (Sandbox Code Playgroud)
也许我误解了你的问题......如果是这样,请忽略我的回答。
编辑
@harold 建议:
numSigned = (numUnsigned^msb_mask)-msb_mask ;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1558 次 |
| 最近记录: |