首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要使用'+‘运算符,因为'|’是非常好的?

为什么要使用'+‘运算符,因为'|’是非常好的?
EN

Stack Overflow用户
提问于 2012-08-22 23:46:45
回答 4查看 193关注 0票数 1

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

假设您必须将第2位和第3位设置为某个值x,而不更改uint中的其他值。这样做是相当琐碎和常见的任务,我倾向于这样做:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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指令)。

那么为什么有些程序员倾向于使用'+‘而不是'|’呢?我是不是错过了一些非常明显的,超级强大的优化?

EN

回答 4

Stack Overflow用户

发布于 2012-08-22 23:51:07

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

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

这就是做慈善。

票数 5
EN

Stack Overflow用户

发布于 2012-08-22 23:53:55

它们是等价的吗?

可以,只要要写入的位域事先已清除即可。否则,它们会以略有不同的方式出错。

是一个比另一个好吗?

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

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

因为它们是等价的,而且两者都不是特别好。

我是不是错过了一些非常明显的,非常强大的优化?

不是的。

票数 4
EN

Stack Overflow用户

发布于 2012-08-22 23:51:58

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

+可以更快地引出逻辑错误。a | a看起来可以工作,而简单的a + a肯定不行(当然,这取决于逻辑,但+版本更容易出错)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12076822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档