条件使用按位运算符
如何使用按位运算符表示条件运算符?
编辑:对不起的解释很抱歉。 这是一个功课问题,我必须使用按位运算来实现条件运算符。 如果允许语句,那将很简单,但它必须是严格按位的运算符。 该函数有三个整数,就像普通的条件运算符一样。 计算第一个int,并根据第一个的值返回最后两个中的一个。 我希望有一个简单的算法。 任何关于从哪里开始的想法都将是一个很大的帮助。 谢谢!
是否允许按位运算符进行转换? 是否允许算术运算符?
你的编辑并不完全清楚,但我认为你需要实现相当于
a ? b : c
其中a
, b
和c
是整数。 这相当于
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;
并且x
由INT_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)