条件使用按位运算符

Mat*_*att 4 c bit-manipulation

如何使用按位运算符表示条件运算符?

编辑:对不起的解释很抱歉.这是一个家庭作业问题,我必须使用按位运算来实现条件运算符.如果允许语句,那将很简单,但它必须是严格按位的运算符.该函数有三个整数,就像普通的条件运算符一样.计算第一个int,并根据第一个的值返回最后两个中的一个.我希望有一个简单的算法.任何关于从哪里开始的想法都将是一个很大的帮助.谢谢!

AnT*_*AnT 10

是否允许按位运算符进行转换?是否允许算术运算符?

你的编辑并不完全清楚,但我认为你需要实现相当于

a ? b : c
Run Code Online (Sandbox Code Playgroud)

其中a,bc是整数.这相当于

a != 0 ? b : c
Run Code Online (Sandbox Code Playgroud)

实现这一目标的一种方法是找到一种方法,a仅使用按位运算符将非零值转换为全1位模式.如果我们弄清楚如何做到这一点,剩下的就很容易了.现在,我不会立即记住任何可以做到这一点的巧妙技巧(我相信它们确实存在),而且我不确定哪些操作符是允许的,哪些不是,所以现在我只会使用像

a |= a >> 1; a |= a >> 2; a |= a >> 4; a |= a >> 8; a |= a >> 16;
a |= a << 1; a |= a << 2; a |= a << 4; a |= a << 8; a |= a << 16;
Run Code Online (Sandbox Code Playgroud)

对于32位整数类型,如果(并且仅当)原始中至少有一个位设置a,则上述应该导致所有位a设置为1.(假设我们正在使用无符号整数,以避免与签名值转移相关的问题).我敢肯定,必须有一个更聪明的方法来做到这一点.例如:a = !a - 1,但我不知道,如果!-是允许的.

一旦我们完成了这一点,原始的条件运算符就相当于

(a & b) | (~a & c)
Run Code Online (Sandbox Code Playgroud)

完成.

  • @Matt:我不明白.什么是'a =!a; a = ~a`?首先,`!`不是按位运算符.你能用吗?其次,整点是在全1位模式中将非零"a"变为零,并使零"a"保持不变(即全零位模式). (2认同)

Jon*_*eet 8

基本上不是.条件运算符将只评估一个第二或第三操作数; 按位运算符始终评估两个操作数.

我认为用位运算符开始考虑条件运算符是不正确的...例如,如果第二个和第三个操作数是指针类型,你不会想到那些用的术语按位运算,是吗?将条件运算符分别处理为按位运算符 - 您不会通过尝试合并它们来为自己做任何好处.