取任意数量的以下类型 2, 2^2(=4), 2^3(=8) , 16 ,32 , 64 ...
如果我们将对两个数字进行 ORing (|),例如
2| 4 = xyz
0010 | 0100 = 0110
然后为了检查这个数字xyz是否包含任何给定的数字,我们用那个数字对xyz进行ANDing,如果我们再次得到那个数字,我们可以说它包含那个数字
0110 & 0010 = 0010
我们可以使用这个属性来优化我们的代码吗?或任何其他实际解决方案?
取任意数量的以下类型 2, 2^2(=4), 2^3(=8) , 16 ,32 , 64 ...
如果我们将对两个数字进行 ORing (|),例如
2| 4 = xyz
0010 | 0100 = 0110
然后为了检查这个数字xyz是否包含任何给定的数字,我们用那个数字对xyz进行ANDing,如果我们再次得到那个数字,我们可以说它包含那个数字
0110 & 0010 = 0010
我们可以使用这个属性来优化我们的代码吗?或任何其他实际解决方案?
这并不完全相同,但是使用按位运算符的另一个“实用解决方案”是使用它们来避免分支。
例子:
if(input < B)
output = Up;
else if(input > A)
output = Down;
可以用按位运算替换,例如:
output = ~(!(input < B) * -1) & Up | ~(!(input > A) * -1) & Down;
就我而言,我每天运行数百万次这样的行,因此它们运行时间的小幅减少所带来的好处超过了编写像这样更复杂的代码而不是简单的 if/else if 所需的时间避免分支。
是的,这种技巧用于枚举标志。
例如:
enum Blah {
Bold = 1,
Italic = 2,
Huge = 4,
Underline = 8
}
如果您使用 2 次幂枚举,则可以执行以下操作:
int mystringFlags = Bold | Italic;
它在许多地方经常使用。