【问题标题】:Converting n bit integer from unsigned to signed [duplicate]将n位整数从无符号转换为有符号[重复]
【发布时间】:2015-08-24 05:29:25
【问题描述】:

假设我有一个整数(32 位),它存储一个 n 位无符号数(n

一个简短的例子来说明我的意思:

int numUnsigned = 15; // Store a 4-bit value 0b1111
int numSigned = ???; // Convert to 4-bit signed value using two's complement
// Now numSigned should be -1, since 0b111 == -1

我整个上午都在弄乱这些位,但似乎无法正确处理。

【问题讨论】:

  • 将 MSB(第 4 位)延长到第 32 位怎么样?这应该会给你第 4 位数字的签名表示。
  • 有点不清楚你从哪里得到n
  • @Caleb 我知道这不是 2 的补充。我只是误解了这个问题。
  • @AlexLop。我读得越多,我就越觉得你的想法是对的。这个问题需要澄清一下。
  • @Caleb 代码第二行的注释有点混乱……(@Boris)

标签: c++ bit-manipulation twos-complement


【解决方案1】:

如果我正确理解了您的问题,您只需要一个符号扩展而不是 2 的互补(至少根据您在第二行代码中的评论)。

如果我是正确的,您可以执行以下操作(假设您有 N 个数字,0

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
}

也许我误解了你的问题......如果是这样,那么请忽略我的回答。

编辑

@harold 建议:

numSigned = (numUnsigned^msb_mask)-msb_mask ;

【讨论】:

  • 你可以简单得多,但我不能回答了
  • @Boris (x ^ 8) - 8 这就是你所需要的
  • @harold 你能在评论中写出更简单的方法吗?
  • 这行得通,因为如果设置了符号,则异或重置它,然后减法借用到顶部,无论位整数是多少。如果符号未设置,则异或设置它,减法再次重置它。 (如果你愿意,你可以偷这个东西,@AlexLop。)
  • @harold 我添加了您的解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2011-06-14
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多