【问题标题】:Conditional Statement using Bitwise operators使用位运算符的条件语句
【发布时间】:2012-04-19 12:56:45
【问题描述】:

所以我看到这个问题已经被问过了,但是答案有点模糊和无益。好的,我只需要使用 "& ^ ~ ! + | >> 来实现一个 c 表达式

表达式需要类似于:a ?乙:c

所以,据我所知,表达式需要类似于:

return (a & b) | (~a & c)

这在 a = 0 时有效,因为将其与 b 相加将给出零,然后 or 表达式将返回右侧,(~a & c) 之所以有效,是因为 ~0 给出了全一,并且将 c 与全一相加返回 c .

但是,当 a > 0 时,这不起作用。有人可以尝试解释这是为什么,或者如何解决它吗?

【问题讨论】:

    标签: c conditional bit-manipulation bitwise-operators


    【解决方案1】:

    换句话说,如果 a 为 false(即 0),则您需要 a 将所有位设置为 0,如果 a 为真(即 a > 0),则将所有位设置为 1 )。

    对于前一种情况,工作已经为您完成;对于后者——尝试计算表达式~!1的结果。

    【讨论】:

    • 嗯,这就是我最初的想法。 ~!1 会给所有完美的。但是,如果我要做 ~!a,并且 a = 0,那么 ~!0 会给我 1110,所以我不知道从这里做什么 /:
    【解决方案2】:

    我会使用!!aa 转换为布尔值,以获得0 或1。x = !!a

    然后我会在二进制补码中否定它。由于您没有可用的一元减号,因此您使用 2 的补码否定的定义:反转位,然后加一:y = ~x + 1。这将清除所有位,或设置所有位。

    然后我将and 直接与一个变量y & b 一起使用,与另一个变量相反:~y & c。这将为其中一个表达式提供 0,而为另一个表达式提供原始变量。当我们or将它们放在一起时,零将不起作用,因此我们将获得原始变量,保持不变。

    【讨论】:

    • 这实际上是完美的。那么为什么添加一个会使所有位设置或清除?我明白为什么会这样,但我不明白这是怎么发生的。
    • 如果我们从 0 开始,那么翻转位会得到所有的 1。当我们加一时,所有这些都归零(进位被设置,但我们忽略它)。如果我们从 1 开始,翻转位会得到 111...10。添加 1 将最后一个 0 变为 1,因此所有位现在都是 1。
    • y = ~x + 1 部分让我感到困惑;我终于认为它在 x = 0 的情况下由于整数溢出而起作用,但这并不明显。对我来说更明确的解决方案是首先将 lsb 移动到 msb 左移(00000001 => 10000000),然后复制 msb 右移:y = (x << 31) >> 31
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 2012-03-26
    • 2023-03-10
    • 2013-07-28
    • 2011-02-18
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    相关资源
    最近更新 更多