寻找有关逻辑操作的答案的清晰度

Looking for clarity on this answer involving logical operations

我正在做作业,我已经得到了正确的答案,但这是出于沮丧而添加运算符的结果,所以我希望有人能为我澄清一下。

我正在测试一个数字是正数还是负数,return 1 如果 x > 0,return 0 否则。仅使用位操作! ~ & ^ | + << >>

这是我的答案:!(x >> 31 | !x)

当我在纸上解决这个问题时,我对它的理解就崩溃了。

  1. 将符号位一直向右移动
  2. OR 那位与 !x
    • 正数为 0 | 1
    • 负数为 1 | 0
  3. !不管怎样,结果总是以 0 结束
    • !(0 | 1) = 0
    • !(1 | 0) = 0

我哪里理解错了?

我想你正在寻找:

size_t shift = sizeof(x) * 8 - 1;
bool ans = x | ~(1 << shift);

您离开的地方在#2:

  • 如果 x 是正数,x >> 31 == 0 并且 !x == 0 所以 !(0 | 0) == 1
  • 如果 x 是负数,x >> 31 == 1 并且 !x == 0 所以 !(1 | 0) == 0
  • 如果 x 为零,x >> 31 == 0 并且 !x == 1 所以 !(0 | 1) == 0