Mat*_*att 4 c bit-manipulation
如何使用按位运算符表示条件运算符?
编辑:对不起的解释很抱歉.这是一个家庭作业问题,我必须使用按位运算来实现条件运算符.如果允许语句,那将很简单,但它必须是严格按位的运算符.该函数有三个整数,就像普通的条件运算符一样.计算第一个int,并根据第一个的值返回最后两个中的一个.我希望有一个简单的算法.任何关于从哪里开始的想法都将是一个很大的帮助.谢谢!
AnT*_*AnT 10
是否允许按位运算符进行转换?是否允许算术运算符?
你的编辑并不完全清楚,但我认为你需要实现相当于
a ? b : c
Run Code Online (Sandbox Code Playgroud)
其中a,b和c是整数.这相当于
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)
完成.
基本上不是.条件运算符将只评估一个第二或第三操作数; 按位运算符始终评估两个操作数.
我认为用位运算符开始考虑条件运算符是不正确的...例如,如果第二个和第三个操作数是指针类型,你不会想到那些用的术语按位运算,是吗?将条件运算符分别处理为按位运算符 - 您不会通过尝试合并它们来为自己做任何好处.