嵌入式Linux与物联网软件开发:C语言内核深度解析
上QQ阅读APP看书,第一时间看更新

2.6 位运算实战演练2

2.6.1 用C语言将寄存器a的bit7~bit17中的值加17(其余位不受影响)

分析:第一步:先读出原来的bit7~bit17的值。第二步:在这个值的基础上加17。第三步:将bit7~bit17清零。第四步:将第二步算出来的值写回到bit7~bit17位。

        tmp =(a &~(0x7ff<<7));                  // bit7~ bit17外的其他位清零
        tmp >>= 7;                               // 右移7位得到bit7~ bit17的值
        tmp += 17;                               // 17
        a &= ~(0x7ff<<7);
        a |= tmp <<7;

2.6.2 用C语言给寄存器a的bit7~bit17赋值937,同时给bit21~bit25赋值17

分析:方法有两种,第一种是第一步bit7~bit17清零,第二步bit21~bit25清零。第二种是,将bit7~bit17和bit21~bit25的清零一步完成。

❶第一种方法如下所示。

        // bit7~bit17赋值937
        a &= ~(0x7ff<<7);                         // bit7~ bit17清零
        a |= 937<<7;
        // bit21~bit25赋值17
        a &= ~(0x1f<<21);                         // bit21~bit25清零
        a |= 17<<21;

❷第二种方法如下所示。

        // bit7~bit17bit21~bit25全清零
        a &= ~((0x7ff<<7) | (0x1f<<21));
        // 93717全部赋值
        a |= ((937<<7) | (17<<21));