【1】示例代码
项目应用示例:
1 #include2 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 #include2 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.
顺序 选择 循环 总结