使用按位运算符消除IF语句

时间:2014-02-24 17:58:50

标签: c++ c bit-manipulation bit bitwise-operators

我试图消除一个IF声明,如果我收到数字32,我想要一个'1',但任何其他数字我想要'0'。

32是0010 0000所以我考虑用1101 1111对我的输入号码进行异或。因此,如果我得到号码32,我最终会得到1111 1111.

现在有任何方法可以对各个位进行AND运算(1111 1111),因为如果我的一个XOR结果为0,则表示我的最终AND-ed值为0,否则为1?

编辑:使用GCC,而不是英特尔编译器(因为我知道那里有很多内在函数)

7 个答案:

答案 0 :(得分:8)

表达式

  !(x ^ 32)
如果你坚持,

会为你做的。

这将始终在C中运行,并且几乎在所有C ++设置中都可以使用。从技术上讲,它在C ++中的计算结果为布尔值,在几乎所有情况下都可以像0或1那样工作,但是如果你想要一个技术上正确的C ++答案:

  (0 | !(x^32))

或:

(int)!(x ^ 32)

或使用更现代/更详细的C ++演员

static_cast<int>(x ^ 32)

答案 1 :(得分:0)

#include <iostream>

int fun(int x)
{
   //   32 == 0010 0000
   // 0xDF == 1101 1111
   return (((x ^ 32) & 0xDF) == 0);
}

int main()
{
   std::cout << "fun(32): " << fun(32) << std::endl;
   std::cout << "fun(16): " << fun(16) << std::endl;
   std::cout << "fun(18): " << fun(18) << std::endl;
   std::cout << "fun(48): " << fun(48) << std::endl;
}

答案 2 :(得分:0)

根据我的经验,使用oprofile,复杂的无分支代码(如'(x&amp; 32)&amp;&amp; amp;)等工具优化实际硬件上的实际低级代码。 !(x&amp; ~32)','!(x ^ 32)'或'(x&amp; 32)&gt;&gt; (5 +(x&amp; ~32))'编译到许多指令而不是'if(x == 32)blah else foo;'

简单的if语句通常可以通过没有分支错误预测惩罚的条件移动来实现。

答案 3 :(得分:0)

如果你使用相同的数字进行异或(即异或),那么你总是得到0.那你为什么不用32与XOR结合并否定结果呢?

答案 4 :(得分:0)

似乎最明显的只是int result = static_cast<int>(x==32)

答案 5 :(得分:0)

对于整数x,如果您保证唯一可能的值为032,并希望将这些值转换为0和{{1}分别,这个操作就足够了:

1

答案 6 :(得分:0)

取x并除以32(右移5位),然后屏蔽除第一位以外的所有位:

unsigned int r = (x>>5)&1;

对于设置了第6位的任何编号(十进制32),现在将设置第一位(十进制1)。其他位需要被屏蔽掉,否则像96(32 + 64)这样的数字会产生3的结果。