• 嵌入式学习笔记(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元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!

  • 相关阅读:
    Ubuntu下 Docker、Docker Compose 的安装教程
    扫码登录基本流程
    Win11一些问题以及解决方案
    推荐几个制作svg的工具
    【算法与数据结构】--算法应用--算法在实际问题中的应用
    好家伙,分布式配置中心这种组件真的是神器
    男孩姓洪取什么名字好听
    【IC刷卡数据专题】IC刷卡数据分析的技术要点
    面试 — 快手(后端开发)
    NIO基础-Selector,Nio概念
  • 原文地址:https://blog.csdn.net/m0_70888041/article/details/134043332