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

本文共 1632 字,大约阅读时间需要 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.

顺序 选择  循环 总结

转载于:https://www.cnblogs.com/Braveliu/p/7443792.html

你可能感兴趣的文章
枚举的使用
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
日志框架--(一)基础篇
查看>>
关于源程序到可运行程序的过程
查看>>
转载:mysql数据库密码忘记找回方法
查看>>
scratch少儿编程第一季——06、人在江湖混,没有背景怎么行。
查看>>
【贪心+DFS】D. Field expansion
查看>>
C# Async与Await的使用
查看>>
Mysql性能调优
查看>>
iOS基础-UIKit框架-多控制器管理-实例:qq界面框架
查看>>
自定义tabbar(纯代码)
查看>>
小程序底部导航栏
查看>>
ibatis学习笔记
查看>>
18-ES6(1)
查看>>
poj1611 简单并查集
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>