按位运算符

时间:2013-05-19 18:46:15

标签: optimization bit-manipulation

取任意数量的以下类型2,2 ^ 2(= 4),2 ^ 3(= 8),16,32,64 ...

如果我们将两个数字的ORing(|)像

那样
2| 4 = xyz 
0010 | 0100 = 0110 

然后检查这个数字xyz是否包含任何给定的数字,我们用该数字对xyz进行AND运算,如果我们再次得到该数字,我们可以说它包含该数字

0110 & 0010 = 0010 

我们可以使用此属性来优化我们的代码吗? 或在任何其他实际的解决方案?

2 个答案:

答案 0 :(得分:0)

是的,这种技巧在枚举标志中使用。

例如:

enum Blah {

Bold = 1,
Italic = 2,
Huge = 4,
Underline = 8
}

如果您使用2次幂枚举,则可以执行以下操作:

int mystringFlags = Bold | Italic;

它经常在很多地方使用。

答案 1 :(得分:0)

这不是完全相同的事情,但使用逐位运算符的另一个“实际解决方案”是使用它们来避免分支。

示例:

if(input < B)
    output = Up;
else if(input > A)
    output = Down;

可以用以下类似的位操作替换:

output = ~(!(input < B) * -1) & Up | ~(!(input > A) * -1) & Down;

在我的情况下,我每天运行这样的行数百万次,所以它们运行时间的小幅减少的好处超过了编写更复杂的代码所需的时间,而不是简单的if /否则,如果要避免分支。