仅使用:

! ~ & ^ | + << >>

我需要找出一个有符号的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/

10-11 23:01