【发布时间】:2015-07-08 16:29:40
【问题描述】:
我正在处理一个家庭作业问题并且我已经得到了正确的答案,但这是出于沮丧添加操作员的结果,所以我希望有人可以为我澄清这一点。
我正在测试一个数字是正数还是负数,如果 x > 0 则返回 1,否则返回 0。只使用位操作! ~ & ^ | + >
这是我的答案:!(x >> 31 | !x)
当我在纸上解决这个问题时,我对它的理解就崩溃了。
- 将符号位一直向右移动
- 用 !x 或该位
- 正值为 0 | 1
- 负数为 1 | 0
- !结果,不管怎样,总是以 0 结尾
- !(0 | 1) = 0
- !(1 | 0) = 0
我理解错了什么?
【问题讨论】:
-
!不是布尔值。按位不是~。不管x有什么符号,如果它不为零,那么!x就是零。 -
为什么正数 x 会导致 !x = 1?
-
猎人 - !0 = 1 对吧?所以如果 x 是正数 (0) !x = 1。对吧?
-
@jlee 当您执行
x >> 31时,您会通过将 x 中的值移动 31 位来获得一个值……但您不会更改实际的x。所以!x对x 中的原始值进行操作,而不是x >> 31的移位值。所以!x只在 x 为 0 时给出1。 -
@Dmitri 谢谢你的解释,我明白我在哪里弄糊涂了
标签: c bit-manipulation bitwise-operators logical-operators