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

  • 相关阅读:
    Docker第四天作业
    千万播放竟有通用公式?B站被小看的爆款机会!
    Window11中Scala环境搭建(内含Scala安装包百度网盘下载地址)
    自己NLP常用框架——自己会调用
    计算机mfc140.dll文件缺失的修复方法分析,一键修复mfc140.dll
    Web前端:20大新AngularJS开发工具
    vue中记录滚动条位置
    线性表的单链表
    人脸检测及追踪回顾
    c++ 语言学习 day03 (QT 知识编译工具变了) 友元(函数和类) ,类的静态成员 ,const成员,运算符重载:,this
  • 原文地址:https://blog.csdn.net/m0_70888041/article/details/134043332