zoukankan      html  css  js  c++  java
  • 移位运算

    【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.

    顺序 选择  循环 总结

  • 相关阅读:
    [日常] Go语言圣经--示例: 并发的Echo服务
    [日常] Go语言圣经--示例: 并发的Clock服务习题
    [日常] Go语言圣经--接口约定习题2
    [日常] Go语言圣经--接口约定习题
    [日常] Linux下的docker实践
    [日常] Go语言圣经-指针对象的方法-bit数组习题2
    [日常] Go语言圣经-指针对象的方法-bit数组习题
    [日常] Go语言圣经-Panic异常,Recover捕获异常习题
    [日常] Go语言圣经-Deferred函数
    [日常] Go语言圣经-可变参数习题
  • 原文地址:https://www.cnblogs.com/Braveliu/p/7443792.html
Copyright © 2011-2022 走看看