【问题标题】:Right shift two's complement number like an unsigned int像无符号整数一样右移二进制补码
【发布时间】:2011-08-30 02:57:51
【问题描述】:

这可能吗?我有一个带符号的 int,需要将它向右移动 4 个位置。我不能将 int 转换为 unsigned int,移位然后再转换回来。之后我需要处理它。

所以如果我有一个像这样的位序列:

x = 1001

并且需要向右移动 2 个点:

x = x >> 2;

我得到 1110;

我想得到 0010。我想不出一种方法来使用 and's 和 or's 来做到这一点。有什么想法吗?

这正是我所需要的。

0x12345678 将 56 替换为 0xab 并最终得到:0x1234ab78

我的方法是得到56的权利,

int right = Ox12345

得到56的左边

int left = 牛 78

得到 56

int 替换 = 56

右转 |离开 |替换

然后返回

Ox1234ab78

如果替换左侧的数字的 MSB 为 1,我会遇到问题。因为我将整个东西向左然后向右移动,它一直将 1 转移。

【问题讨论】:

  • 您的答案需要在某处进行转换,即使只是为了构建位掩码。您需要更准确地指定家庭作业的限制条件。
  • 我很好奇:什么可能会阻止您使用铸造解决方案?
  • @Henning:这是作业。可能任务指定不这样做。

标签: c bit-manipulation


【解决方案1】:

另一个解决方案,因为我记得在高中时做过类似的作业,我们不允许使用大的十六进制数字,如下所示:

x = (x >> 2) & ~((1 << 31) >> 1)。这给出了与我的其他答案相同的答案,但不需要大的十六进制数。

【讨论】:

    【解决方案2】:

    您可以使用x = (x >> 2) & 0x3FFFFFFF(假设您说的是 32 位整数)。这会将 2 个最高位设置为 0。

    编辑:

    看到你的问题的变化,而不是你的方法,你可以这样做:

    int result;
    int start = 0x12345678, replace = 0xab;
    result = (start & ~0xFF00) | (replace << 8);
    

    【讨论】:

    • 严格来说,这会导致未定义的行为。
    • C 标准未定义右移负值。
    • @Oli:如果 OP 的任务是在不带符号位的情况下右移一个数字,我猜预期的结果将是一个公平的假设。
    • 它是实现定义的,而不是未定义的
    • @Random:是的,你是对的。这是未定义的左移。
    猜你喜欢
    • 1970-01-01
    • 2016-05-18
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多