这更多的是一个哲学问题,但我在代码库中见过很多次,并不真正理解这种编程方法是如何产生的。
假设您必须将第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指令)。
那么为什么有些程序员倾向于使用'+‘而不是'|’呢?我是不是错过了一些非常明显的,超级强大的优化?
发布于 2012-08-22 23:51:07
确实,对于某些值,一些算术操作可以实现为简单的按位操作,但这本质上是一个实现细节,您永远不应该向读者公开。首先,也是最重要的,代码的逻辑应该是清晰的,如果可能的话,应该是自解释的。编译器将为您选择适当的低级操作来实现您的需求。
这就是做慈善。
发布于 2012-08-22 23:53:55
它们是等价的吗?
可以,只要要写入的位域事先已清除即可。否则,它们会以略有不同的方式出错。
是一个比另一个好吗?
不,尽管有些人会说按位操作更清楚地表达了意图。
那么为什么一些程序员倾向于使用'+‘而不是'|’呢?
因为它们是等价的,而且两者都不是特别好。
我是不是错过了一些非常明显的,非常强大的优化?
不是的。
发布于 2012-08-22 23:51:58
那么为什么一些程序员倾向于使用'+‘而不是'|’呢?
+可以更快地引出逻辑错误。a | a看起来可以工作,而简单的a + a肯定不行(当然,这取决于逻辑,但+版本更容易出错)。
当然,你应该坚持标准的操作方式(当你想要位操作时使用位操作,当你想做数学操作时使用算术操作)。
https://stackoverflow.com/questions/12076822
复制相似问题