仅使用:
! ~ & ^ | + << >>
我需要查明是否可以将带符号的 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/