gpt4 book ai didi

c - 如何使用按位运算返回 0?

转载 作者:太空宇宙 更新时间:2023-11-04 02:57:03 25 4
gpt4 key购买 nike

我有以下功能

int sign(int x) {

int sign = (x >> 31);
sign = sign | 1;
return sign;

}

我希望:

  • 对于负数返回 -1(第一行)
  • 为正数返回 1(第二行)
  • 为零返回 0

我卡在最后一项上了。如果 x 为零,我如何使用按位运算符仅返回零?

最佳答案

不错的小拼图。假设您有 32 位整数:

int sign( int x )
{
// if any bit is on, all bits are on. else zero.
int lowBit = x;
lowBit |= lowBit >> 16;
lowBit |= lowBit >> 8;
lowBit |= lowBit >> 4;
lowBit |= lowBit >> 2;
lowBit |= lowBit >> 1;
lowBit &= 1;

int signBit = x & 0x80000000;
signBit |= signBit >> 16;
signBit |= signBit >> 8;
signBit |= signBit >> 4;
signBit |= signBit >> 2;
signBit |= signBit >> 1;
signBit &= 0xFFFFFFFE;

return signBit | lowBit;
}

这是它的工作原理。我将用 4 位数字进行解释,但解释是概括性的。您必须从三类位模式进行映射:

0000    -> 0000
0xxx -> 0001
1yyy -> 1111

其中 x 可以是除 000 以外的任何值,yyy 可以是任何值。

所以首先你想要一个位,如果寄存器中的任何位为 1,则为 1,否则为 0。所以我们“涂抹”寄存器,这样如果任何位为高,所有位都为高,并且我们保留该位作为结果中低位的值。

然后我们“涂抹”符号位。最后我们将它们“或”在一起。

读者练习:如果您有 32 位整数,但有 64 位寄存器,则可以将操作数减半。

更新:它总是可以做得更好(未经测试):

int sign( int x )
{
int lowBit = !!x; // double ! operator, wtf? yes...

int signBit = x & 0x80000000;
signBit |= signBit >> 16;
signBit |= signBit >> 8;
signBit |= signBit >> 4;
signBit |= signBit >> 2;
signBit |= signBit >> 1;
signBit &= 0xFFFFFFFE;

return signBit | lowBit;
}

关于c - 如何使用按位运算返回 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16170545/

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