• 嵌入式学习笔记(63)位操作实战


    (1)给定一个整型数a,设置a的bit3,保证其他位不变。

    a |= (1<<3)

    (2)给定一个整形数a,设置a的bit3~bit7,保持其他位不变

    a |= (0x1f<<3)

    (3)给定一个整型数a,清除a的bit15,保证其他位不变。

    a &= ~(1<<15)

    (4)给定一个整形数a,清除a的bit15~bit23,保持其他位不变。

    a &= ~(0x1ff<<15)

    (5)给定一个整形数a,取出a的bit3~bit8。

    a &= (0x3f<<3)

    a >>= 3

    (6)给一个寄存器的bit7~bit17赋值937

    a &= ~(0x7ff<<7)

    a |= (937<<7)

    (7)给一个寄存器的bit7~bit17中的值加17

    b = ((a & (0x7ff<<7))>>7 + 17)<<7

    a &= ~(0x7ff<<7)

    a |= b

    (8)给一个寄存器的bit7~bit17赋值937,同时给bit21~bit25赋值17.

    a &= ~((0x7ff<<7) | (0x1f<<21))

    a |= ((937<<7) | (17<<21))

    (9)用宏定义来完成位运算

    截取变量的部分连续位:

    #define GETBITS(x, n, m) ((x & (~(~(0U)<<(m-n+1)))<<(n-1)) >> (n-1))

    分析:这个题目相当于我们(5)中做的事情,只不过要用宏来实现。

    这个题目相当于是要把x的bit(n-1)到bit(m-1)取出来

    复杂宏怎么分析:

    ((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1))

    第一步,先分清楚这个复杂宏分为几部分:2部分

    (x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1)

    分析为什么要>>(n-1),相当于是我们(5)中的第二步

    第二步,继续解析剩下的:又分为2部分

    x & ~(~(0U)<<(m-n+1))<<(n-1)

    分析为什么要&,相当于我们(5)中的第一步

    第三步,继续分析剩下的:

    ~  (~(0U)<<(m-n+1)) << (n-1)

    这个分析时要搞清楚第2坨到底应该先左边取反再右边<<还是先右边<<再左边取反。

    解法:第一,查C语言优先级表;第二,自己实际写个代码测试。

    说明这个式子应该是 ~(~(0U)<<(m-n+1)) << (n-1) ,这就又分为2部分了

      嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。在评论区私信“嵌入式”0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!

  • 相关阅读:
    Jmeter二次开发实现rsa加密
    搭建知识库系统不难,选对工具很重要!
    详解JS中 call 方法的实现
    【矩阵论】2. 矩阵分解——正规谱分解——正规阵
    每日一题 102二叉树的层序遍历
    linux下查找文件的相关命令
    presto插件机制揭秘:探索无限可能的数据处理舞台
    计算机组成原理期中考试
    Databend 源码阅读: Storage 概况和 Read Partitions
    C语言——实用调试技巧——第1篇——(第22篇)
  • 原文地址:https://blog.csdn.net/m0_70888041/article/details/134043332