《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.5 位运算实战演练1...

    xiaoxiao2024-04-09  111

    本节书摘来自异步社区《嵌入式Linux与物联网软件开发——C语言内核深度解析》一书中的第2章,第2.5节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    2.5 位运算实战演练1

    2.5.1 给定整型数a,设置a的bit3,保证其他位不变

    分析:将整数a和bit3为1,其余bit为0的数进行位或运算即可得到结果。

    构造bit3为1的数。

    1<<3

    然后和整数a相位或并且赋值给a。

    a = a | (1<<3);或者a |= (1<<3);

    2.5.2 给定整型数a,设置a的bit3~bit7,保持其他位不变

    分析:构造数的bit3~bit7为1。

    构造bit3~bit7为1的数。

    0x1f<<3

    和整数a相位或并赋值给a。

    a = a | (0x1f<<3) 或者a |= (0b11111<<3);

    2.5.3 给定整型数a,清除a的bit15,保证其他位不变

    分析:将整数a和一个bit15为0,其余bit位为1的数进行位与运算即可得结果。

    构造bit15为0,其余位为1的数。在构造这个数之前,通过2.3节的分析需要先构造bit15为1,其余位为0的数,然后位取反即可。

    ~(1<<15)

    和整数a相位与并赋值给a。

    a = a & (~(1<<15));或者a &= (~(1<<15));

    2.5.4 给定整型数a,清除a的bit15~bit23,保持其他位不变

    分析:将整数a和一个bit15~ bit23为0,其余bit位为1的数进行位与运算即可得结果。

    构造bit15~ bit23为0,其余位为1的数。

    ~(0x1ff<<15)

    和整数a位与并赋值给a。

    a = a & (~(0x1ff<<15));或者a &= (~(0x1ff<<15));

    2.5.5 给定整型数a,取出a的bit3~bit8

    分析:先将这个数bit3~bit8不变,其余位全部清零;再将其右移3位得到结果;想明白了上面的两步算法,再将其转为C语言实现即可。

    构造bit3~ bit8为1,其余位为0的数。

    0x3f<<3

    和整数a位与并赋值给a。

    a &= (0x3f<<3);

    再将a右移3位。

    a >>= 3;

    2.5.6 用C语言给寄存器a的bit7~bit17赋值937(其余位不受影响)

    分析:我们只需要将bit7~bit17全部清零,然后再将937设置到bit7~bit17位,这个过程中必须注意的一点就是不能影响其他位。

    构造bit7~bit17为0,其余位为1的数。

    ~(0x7ff<<7)

    bit7~bit17清零。

    a &= ~(0x7ff<<7);

    构造bit7~bit17为937,其余位为0的数。

    937<<7

    将937写入a的bit7~bit17。

    a |= (937<<7); 相关资源:《敏捷软件开发:原则、模式与实践》【带完整书签版】.pdf
    最新回复(0)