为什么要使用' +'操作员' |'非常好吗?

时间:2012-08-22 15:46:45

标签: c++ add bitwise-operators bitwise-or

这更像是一个哲学问题,但我在代码库中已经多次看到这一点,并且并不真正理解这种编程方法是如何形成的。

假设您必须将第2位和第3位设置为某个值x而不更改uint中的其他值。这样做是非常微不足道的,也是一项常见的任务,我倾向于这样做:

uint8_t someval = 0xFF; //some random previous value
uint8_t x = 0x2; //some random value to assign.
someval = (somval & ~0xC) | (x << 2); //Set the value to 0x2 for bits 2-3

我见过代码或使用'|'使用'+':

uint8_t someval = 0xFF; //some random previous value
uint8_t x = 0x2; //some random value to assign.
someval = (somval & ~0xC) + (x << 2); //Set the value to 0x2 for bits 2-3

它们是否相同?
是。

一个人比另一个好吗? 只有你的硬件没有按位OR指令,但我从未见过没有按位OR的处理器(即使是小型PIC10处理器也有OR指令)。

那么为什么有些程序员倾向于使用'+'代替'|'?我在这里错过了一些非常明显,优秀的强大优化吗?

4 个答案:

答案 0 :(得分:5)

  • 如果要执行按位运算,请使用按位运算符。

  • 如果要执行算术运算,请使用算术运算符。

对于某些值,某些算术运算可以实现为简单的按位运算,但这实际上是一个实际细节,您永远不应该向您的读者公开。首先,代码的逻辑应该是清晰的,如果可能的话,也应该是不言自明的。编译器将为您选择适当的低级操作来实现您的愿望。

那是是慈善事业。

答案 1 :(得分:4)

  

他们是等同的吗?

是的,只要写入的位域事先清楚。否则,它们会以稍微不同的方式出错。

  

一个比另一个好吗?

不,虽然有人会说按位操作更清楚地表达了意图。

  

那么为什么有些程序员倾向于使用'+'代替'|'?

因为它们是等同的,并且两者都不比另一种特别好。

  

我在这里错过了一些非常明显,优秀的强大优化吗?

没有

答案 2 :(得分:0)

  

那么为什么有些程序员倾向于使用'+'代替'|'?

+ 可以更快地带出逻辑错误。 a | a似乎可行,而简单的a + a肯定不会(当然,取决于逻辑,但+版本更容易出错)。

当然你应该坚持标准的做事方式(当你想要按位操作时使用按位操作,当你想做数学运算时使用算术运算)。

答案 3 :(得分:0)

这只是一种风格问题。任何现代CPU都将以相同的周期数(通常为1)完成两个操作。我个人在这些情况下更喜欢|,因为它更明确地向代码阅读器说明你正在做一点点而不是算术。

如果您的代码中存在错误,那么使用+可能会导致奇怪的行为,而使用|会导致错误。例如,如果您意外地将相同的位包含两次,则将其再次进行“或”操作是无操作,但添加它将清除该位并进入下一位(如果设置了更多位,则可能更远)。因此,这通常会导致失败快速行为,而不是失败掩盖行为,这通常是可取的。