条件使用按位运算符

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

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

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

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

 a ? b : c 

其中abc是整数。 这相当于

 a != 0 ? b : c 

实现这一目标的一种方法是找到一种方法,仅使用按位运算符将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; 

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

一旦我们完成了这个,原始的条件运算符就等同于

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

完成。

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

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

我认为OP正在寻找一种表达通常需要以无分支方式进行条件化的方法的方法。 例如(假设unsigned x,y,z;并且xINT_MAX ):

 if (x>2) y+=z; 

可表示为:

 y += z & -(2-x >> sizeof(unsigned)*CHAR_BIT-1); 

我想到了这个例子,因为我已经在很多场合使用过“无分支二进制排序”。 当搜索的数组的大小是常量时,这允许将搜索循环完全展开到没有分支的一系列操作中,并且每步只编译几个操作码。 那些反对写“汇编语言”的人可能更愿意写它:

 y += (x>2) ? z : 0; 

并希望编译器生成等效的位掩码或cmov指令。 🙂

在最基本的层面上它变成了电子产品。 看到这个 。 我想不出你的问题的任何其他申请。

如果您引用三元选择运算符,则可以使用按位运算来表示,但仅在某些情况下(实际上它是在某些情况下使用按位运算的优化)。 例如: (getsomevalue() == 1) ? somepointer : NULL; (getsomevalue() == 1) ? somepointer : NULL; 可以表示为somepointer & ~((unsigned)(getsomevalue()) - 1); 假设getsomevalue()只返回1或0(又名BOOL)