12

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

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

所以,据我所知,表达式需要看起来像:

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

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

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

4

2 回答 2

19

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

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

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

于 2012-04-05T19:15:24.197 回答
3

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

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

于 2012-04-05T19:09:40.383 回答