gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:05:35 25 4
gpt4 key购买 nike

仅使用:

! ~ & ^ | + << >>

我需要查明是否可以将带符号的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com