博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
移位运算
阅读量:6219 次
发布时间:2019-06-21

本文共 1580 字,大约阅读时间需要 5 分钟。

【1】示例代码

项目应用示例:

1 #include 
2 using namespace std; 3 4 #define CYCLE_DATA_KEY(baseCycleId, type, elementId) (((baseCycleId) << 16) | ((type) << 14) | ((elementId) << 8)) 5 #define BASE_CYCLE_ID(dataKey) (((dataKey) >> 16) & 0xFFFF) 6 #define DATA_TYPE(dataKey) (((dataKey) >> 14) & 0x3) 7 #define ELEMENT_ID(dataKey) (((dataKey) >> 8) & 0x3F) 8 9 void main()10 {11 int nConfig = CYCLE_DATA_KEY(2, 2, 2);12 cout << "nConfig :: " << nConfig << endl;13 cout << "BASE_CYCLE_ID :: " << BASE_CYCLE_ID(nConfig) << endl;14 cout << "DATA_TYPE :: " << DATA_TYPE(nConfig) << endl;15 cout << "ELEMENT_ID :: " << ELEMENT_ID(nConfig) << endl;16 system("pause");17 }18 19 // run out:20 /*21 nConfig :: 16435222 BASE_CYCLE_ID :: 223 DATA_TYPE :: 224 ELEMENT_ID :: 225 请按任意键继续. . .26 */

【2】分析图解

移位运算分析:

 

【3】移位运算

位运算应用口诀:

清零取位要用与,某位置一可用或;若要取反和交换,轻轻松松用异或。

【4】与移位运算有关的操作符优先级问题

示例代码如下:

1 #include 
2 using namespace std; 3 4 void main() 5 { 6 cout << "value1 :: " << (1 << 2 + 3 << 4) << endl; 7 cout << "value2 :: " << (1 << 2) + (3 << 4) << endl; 8 system("pause"); 9 }10 11 // run out:12 /*13 value1 :: 51214 value2 :: 5215 请按任意键继续. . .16 */

常常有人会写这样的表达式:1 << 2 + 3 << 4,其本意是(1 << 2) + (3 << 4)。

但在C语言中,前面的表达式等价于1 << (2 + 3) << 4,这是由于加法(和减法)的优先级比移位运算要高。

然后,按照从左至右结合性规则,括号应该是这样打的(1 << (2 + 3)) << 4,因此得到的结果是512,而不是期望的52。

在C表达式中搞错优先级是一种常见的程序错误,而且常常很难检查出来。所以当你拿不准的时候,请加上括号!

 

Good Good Study, Day Day Up.

顺序 选择  循环 总结

转载地址:http://wsoja.baihongyu.com/

你可能感兴趣的文章
Android:自定义控件样式(Selector)
查看>>
第一个springboot项目
查看>>
Windows10 使用docker toolbox安装docker
查看>>
响应式布局简介
查看>>
oracle 备份脚步
查看>>
docker探索-docker安装运行tomcat(六)
查看>>
详解CorelDRAW中如何合并与拆分对象
查看>>
ASP.NET跨平台最佳实践
查看>>
Python学习笔记8-单元测试(1)
查看>>
程序员英语学习指引
查看>>
三层和MVC 初识篇
查看>>
RecyclerView重用导致的元素重复问题
查看>>
动态调用WCF服务
查看>>
自訂 SQL Server 的 PadLeft、PadRight 字串填補函數
查看>>
c# enum用法
查看>>
Python—发邮件总结
查看>>
ORA-01031: insufficient privileges
查看>>
ObjC.instancetype
查看>>
Yacc 与 Lex 快速入门
查看>>
文件夹路径映射 / 映射虚拟目录
查看>>