本节书摘来自异步社区《嵌入式Linux与物联网软件开发——C语言内核深度解析》一书中的第2章,第2.6节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区“异步社区”公众号查看。
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~bit17和bit21~bit25全清零
a &= ~((0x7ff<<7) | (0x1f<<21));
// 937和17全部赋值
a |= ((937<<7) | (17<<21));