首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >右移测试位与左移速度相同?

右移测试位与左移速度相同?
EN

Stack Overflow用户
提问于 2014-01-29 13:13:22
回答 3查看 303关注 0票数 3

是同样的速度吗?

代码语言:javascript
运行
复制
#define CHECK_BIT_BOOL(var,pos) ((var>>(pos)) & 1)

作为

代码语言:javascript
运行
复制
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))

目标是不使用BOOL宏,例如:

代码语言:javascript
运行
复制
#define BOOL(x) (!(!(x)))

BOOL(CHECK_BIT(foo, 3));

这样做更好:CHECK_BIT_BOOL(foo,3);

general test bit question

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-29 13:48:55

当前的C编译器在将典型代码转换成最好的机器语言方面非常聪明。在大多数情况下,试图超越编译器会将其混淆为生成哑代码。

现代CPU一次可以执行多个操作,无论消耗什么时间,都可能会被其他操作所掩盖,没有任何区别。CPU比内存快得多,大多数程序被内存访问速度比计算速度慢得多。

您的时间编程比通过这种微优化在运行时获得的任何收益更有价值,除非代码每天在数百万台机器上运行数千次。专注于简单、干净、明显的正确和可理解的代码。下周读的时候你会很感激的。

票数 4
EN

Stack Overflow用户

发布于 2014-01-29 13:36:24

如果pos是常数,那么CHECK_BIT可能会稍微快一些,因为没有必要在运行时执行转换。否则,两者很可能是相同的。但是,正如您所指出的,如果需要将结果限制为0或1,则需要在CHECK_BIT之后执行更多的工作。

当然,这取决于您的目标平台,而且,如果您的性能要求非常严格,需要担心单个处理器指令的成本,那么您就必须对真实系统上的实际性能进行分析和度量。

票数 0
EN

Stack Overflow用户

发布于 2014-01-29 13:20:13

如果var和pos不在内存中,而是在寄存器中,则CHECK_BIT_BOOL和CHECK_BIT非常快。即使它在内存中--您无法更快地获得它(如果var为1字节,您可以创建256*8结果数组,并通过只返回结果var+ 256*8立即返回结果,但它将比执行>>和&要慢得多。)

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

https://stackoverflow.com/questions/21432177

复制
相关文章

相似问题

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