2013-05-19 58 views
1

采取任何数目的以下2型,2^2(= 4),2^3(= 8),16,32,64 ...逐位操作者

如果我们将或门(|)两个数字像

2| 4 = xyz 
0010 | 0100 = 0110 

的再检查这个这个数字XYZ是否包含任何给定的数字,我们做取与XYZ与这个数字,如果我们再次得到这个数字,我们可以说,它包含了数

0110 & 0010 = 0010 

我们可以使用此属性来选择模仿我们的代码? 还是其他实用解决方案?

+0

你在谈论什么样的优化?你只是问是否有任何实际使用的位运算符? –

+0

我们已经在我们自己的框架中使用它来添加和检查已经存在的事件。这是在真实世界编程中使用此功能的一个场景。这比做比较要快得多。那么你能否提出其他我可以使用这个功能的案例? – sandyJoshi

+2

你可以在任何你有钉子的地方使用这把锤子。这不是一个建设性的问题。 – sehe

回答

0

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

例子:

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

可替换的逐位运算的东西,如:

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

在我的情况,我会像这样运行了数百万次线的日子,所以受益它们所花费的时间的少量减少超过了编写一些更复杂的代码所需的时间,而不是简单的if/else,以避免分支。

0

是的,这种技巧用于枚举标志。

例如:

enum Blah { 

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

如果使用功率为2的枚举,那么你可以做:

int mystringFlags = Bold | Italic; 

它用于经常在很多地方。

+0

这不是为了优化 – sehe

+0

@ not-sehe是的,我已经把它改为“诡计”了。这也让我很烦恼 –