移位运算
【1】示例代码
项目应用示例:
1 #include <iostream> 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 :: 164352 22 BASE_CYCLE_ID :: 2 23 DATA_TYPE :: 2 24 ELEMENT_ID :: 2 25 请按任意键继续. . . 26 */
【2】分析图解
移位运算分析:
【3】移位运算
位运算应用口诀:
清零取位要用与,某位置一可用或;若要取反和交换,轻轻松松用异或。
【4】与移位运算有关的操作符优先级问题
示例代码如下:
1 #include <iostream> 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 :: 512 14 value2 :: 52 15 请按任意键继续. . . 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.
顺序 选择 循环 总结