c - 如何判断 32 位 int 是否适合 16 位 short

标签 c integer bit-manipulation

仅使用:

! ~ & ^ | + << >>

我需要查明是否可以将带符号的 32 位整数表示为 16 位二进制补码整数。

我的第一个想法是将 MSB 16 位和 LSB 16 位分开,然后对最后 16 位使用掩码,这样如果它不为零,就无法表示,然后使用该数字检查MSB 位。

我需要写的函数的一个例子是:fitsInShort(33000) = 0(不能表示)和fitsInShort(-32768) = 1(可以表示)

最佳答案

bool fits16(int x)
{
    short y = x;
    return y == x;
}

开个玩笑 :) 这是真正的答案,假设 int 是 32 位,short 是 16 位和二进制补码表示:

编辑:请查看最后一次编辑以获得正确答案!

bool fits16(int x)
{
    /* Mask out the least significant word */
    int y = x & 0xffff0000;
    if (x & 0x00008000) {
        return y == 0xffff0000;
    } else {
        return y == 0;
    }
}

没有 if 语句我相信应该这样做:

return (
    !(!(x & 0xffff0000) || !(x & 0x00008000)) ||
    !((x & 0xffff0000) || (x & 0x00008000))
);

编辑:Oli 是对的。我不知何故认为他们是被允许的。这是最后一次尝试,并附有解释:

我们需要 x 的 17 个最高有效位全为 1 或全为 0。因此,让我们从屏蔽其他位开始:

int a = x & 0xffff8000; // we need a to be either 0xffff8000 or 0x00000000
int b = a + 0x00008000; // if a == 0xffff8000 then b is now 0x00000000
                        // if a == 0x00000000 then b is now 0x00008000
                        // in any other case b has a different value
int c = b & 0xffff7fff; // all zeroes if it fits, something else if it doesn't
return c;

或者更简洁:

return ((x & 0xffff8000) + 0x8000) & 0xffff7fff;

关于c - 如何判断 32 位 int 是否适合 16 位 short,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7337526/

相关文章:

c - 右移按位运算符的异常行为

java - 编程 : Minimum steps required to convert a binary number to zero

C - 如何通过 scanf 多次使用字符串

嵌套列表的 C 等价物 (Python)

c - 使用结构编程简单存储学生信息

java - 在 Java 中如何将任何整数四舍五入到下一个最高的一百位?

integer - 如何生成满足某些限制的整数?

c++ - YARN下的C/C++程序

java - 如果包装器使用拆箱,需要什么 intValue() 方法?

algorithm - 从每个间隔中找到 1 个数字,使得所有的 OR 等于 X