寻找有关逻辑操作的答案的清晰度
Looking for clarity on this answer involving logical operations
我正在做作业,我已经得到了正确的答案,但这是出于沮丧而添加运算符的结果,所以我希望有人能为我澄清一下。
我正在测试一个数字是正数还是负数,return 1 如果 x > 0,return 0 否则。仅使用位操作! ~ & ^ | + << >>
这是我的答案:!(x >> 31 | !x)
当我在纸上解决这个问题时,我对它的理解就崩溃了。
- 将符号位一直向右移动
- OR 那位与 !x
- 正数为 0 | 1
- 负数为 1 | 0
- !不管怎样,结果总是以 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
我正在做作业,我已经得到了正确的答案,但这是出于沮丧而添加运算符的结果,所以我希望有人能为我澄清一下。
我正在测试一个数字是正数还是负数,return 1 如果 x > 0,return 0 否则。仅使用位操作! ~ & ^ | + << >>
这是我的答案:!(x >> 31 | !x)
当我在纸上解决这个问题时,我对它的理解就崩溃了。
- 将符号位一直向右移动
- OR 那位与 !x
- 正数为 0 | 1
- 负数为 1 | 0
- !不管怎样,结果总是以 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