我试图消除一个IF声明,如果我收到数字32,我想要一个'1',但任何其他数字我想要'0'。
32是0010 0000所以我考虑用1101 1111对我的输入号码进行异或。因此,如果我得到号码32,我最终会得到1111 1111.
现在有任何方法可以对各个位进行AND运算(1111 1111),因为如果我的一个XOR结果为0,则表示我的最终AND-ed值为0,否则为1?
编辑:使用GCC,而不是英特尔编译器(因为我知道那里有很多内在函数)
答案 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
,如果您保证唯一可能的值为0
和32
,并希望将这些值转换为0
和{{1}分别,这个操作就足够了:
1
答案 6 :(得分:0)
取x并除以32(右移5位),然后屏蔽除第一位以外的所有位:
unsigned int r = (x>>5)&1;
对于设置了第6位的任何编号(十进制32),现在将设置第一位(十进制1)。其他位需要被屏蔽掉,否则像96(32 + 64)这样的数字会产生3的结果。