【问题标题】:Looking for clarity on this answer involving logical operations寻找涉及逻辑运算的答案的清晰度
【发布时间】:2015-07-08 16:29:40
【问题描述】:

我正在处理一个家庭作业问题并且我已经得到了正确的答案,但这是出于沮丧添加操作员的结果,所以我希望有人可以为我澄清这一点。

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

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

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

  1. 将符号位一直向右移动
  2. 用 !x 或该位
    • 正值为 0 | 1
    • 负数为 1 | 0
  3. !结果,不管怎样,总是以 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


【解决方案1】:

你离开的地方在#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

【讨论】:

  • 谢谢!这正是我一直在寻找的。我仍然很困惑为什么,因为 x 是正数,!x = 0。如果 x 是正数,符号位将为 0。所以不会!0 = 1?还是我完全理解错了
  • @jlee 如果 x 为正,则它不为零。您将 x 与 x>>31 混淆了。
  • ! 是逻辑否定运算符。因此,在布尔上下文中,如果 x 为 0,则 !x 将为 1,如果 x 非零,则 !x 将为 0
  • 我明白我错在哪里了。出于某种原因,我认为 x 的值正在更改为它的符号位,而我正在做符号位 | !sign 位,这当然是错误的
【解决方案2】:

我想你正在寻找:

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

【讨论】:

  • 对不起,我想你误解了我的问题。我的回答是正确的(至少测试脚本是这样说的)。我只是想澄清一下我的推理哪里错了
  • 为避免实现定义的行为,还建议将x 强制转换为无符号类型。
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 2018-11-28
相关资源
最近更新 更多