寻找涉及逻辑运算的答案的清晰度

时间:2015-07-08 16:29:40

标签: c bit-manipulation bitwise-operators logical-operators

我正在做一个家庭作业问题,我已经得到了正确答案,但这是因为沮丧地增加了操作员,所以我希望有人可以为我澄清这个问题。

我正在测试数字是正数还是负数,如果x>则返回1 0,否则返回0。只使用位操作! 〜& ^ | +<< >>

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

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

  1. 将符号位一直移到右侧
  2. 或者那个位!x
    • 肯定是0 | 1
    • 否定将是1 | 0
  3. !结果,总是,无论如何,最终为0
    • !(0 | 1)= 0
    • !(1 | 0)= 0
  4. 我理解错误是什么?

2 个答案:

答案 0 :(得分:1)

我认为你在寻找:

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

答案 1 :(得分:1)

你关注的地方是#2:

  • 如果x为正,则x>&gt; 31 == 0和!x == 0 so!(0 | 0)== 1
  • 如果x为负,则x>&gt; 31 == 1和!x == 0 so!(1 | 0)== 0
  • 如果x为零,x>&gt; 31 == 0和!x == 1 so!(0 | 1)== 0