1

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

假设您必须将位 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

4 回答 4

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

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

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

这就是慈善。

于 2012-08-22T15:51:07.487 回答
4

它们是等价的吗?

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

这个比那个好吗?

不,尽管有些人会说按位运算更清楚地表达了意图。

那么为什么有些程序员会倾向于使用'+'而不是'|'呢?

因为它们是等价的,并且没有一个比另一个特别好。

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

不。

于 2012-08-22T15:53:54.603 回答
0

那么为什么有些程序员会倾向于使用'+'而不是'|'呢?

+ 可以更快地找出逻辑错误。a | a似乎可以工作,而简单的a + a绝对不会(当然,取决于逻辑,但+版本更容易出错)。

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

于 2012-08-22T15:51:58.050 回答
0

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

如果您的代码中有错误,那么 using+可能会导致奇怪的行为,而 using|往往会掩盖错误。例如,如果您不小心包含了两次相同的位,则再次对它进行 ORing 是无操作的,但添加它将清除该位并进入下一个位(如果设置了更多位,可能会更远)。因此,这通常会导致故障快速行为,而不是通常更可取的故障掩蔽行为。

于 2012-08-22T15:52:05.217 回答