zoukankan      html  css  js  c++  java
  • 单片机位运算操作

    学习单片机软件的时候难免会设计修改某一位,例如给a寄存器的第3位置1,或者清零。在写位时,要注意不能修改其他位,因为每一位都有自己的作用。下面就说一下具体怎么操作:

    先说一下口诀:清零 & (与)零, 置位 |(或)一 , 取反用 ~ ;

    下面通过具体的栗子来学习一下:(以32为例)

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

    a = a | (0b1000) ; 
    a |= (1 << 3) ;

      

    更好的形式是 a |= (1 << 3) ;

    2. 给定一个整数a , 设置a的bit3~bit7 , 保证其他位不变。

    a = a | (0b1111 1000) ; 
    a |= (0x1f << 3)

      


    更好的形式是 a |= (0b11111 << 3) ; 或 

    3. 给定一个整数a , 清除a的bit3 , 保证其他位不变。


    a = a & (0b0111) ;
    更好的形式是 

    a &= (~(1 << 3)) ;
    

      

    4. 给定一个整数a , 清除a的bit3~bit7 , 保证其他位不变。
    a = a &(0b0000 0111) ;
    更好的形式是 a &= (~(0b11111 << 3)) 或

     a &= (~(0x1f << 3))
    

      

    5. 给定一个整数a , 取出a的bit3~bit7 。
    思想:
    (1)将其他位清零
    (2)右移3位
    代码:
    a = (a & (0x1f << 3)) >> 3 ;

    6. 给寄存器a的bit3~bit7赋值12
    思想:
    (1)将bit3~bit7清零
    (2)将12左移3位 ,写入a
    代码:
    a = (a & ~(0x1f << 3)) | (12 << 3) ;

    7. 给寄存器a的bit3~bit7加上12
    思想:
    (1)先取出bit3~bit7
    (2)将取出的数加上12
    (3)将a的bit3~bit7 清零
    (4)将取出的数写入a
    代码:
    tmp = a | (0x1f << 3) >> 3 ;
    tmp += 12 ;
    a = a & ~(0x1f << 3) ;
    a |= tmp << 3 ;

    8. 给寄存器a的bit3~bit7 赋值4和 bit 8 ~ bit 12 赋值7
    写法一:(只是简单的重复赋值运算)
    a = (a & (~0x1f << 3)) | (4 << 3) ;
    a = (a & (~0x1f << 8)) | (7 << 8) ;
    写法二:
    a &= ~((0x1f << 3) | (0x1f << 8)) ;
    ---------------------

  • 相关阅读:
    《面试系列一》一个怂到极点的开始
    NuGet 私房服务使用帮助
    Nuspec 范本文件
    送给前线码农的话 – 大牛们的经典语录
    Visual Studio 增加源码头注释
    为 Orchard 增加 MVC 的脚手架.
    为 Orchard 增加扩展的存储位置
    Orchard 瘦身优化
    Hybrid Multiple Attention Network for Semantic Segmentation in Aerial Images
    【nvidia jetson xavier】 Linux系统安装+Deepstream 5.1环境部署
  • 原文地址:https://www.cnblogs.com/huangyangquan/p/10642136.html
Copyright © 2011-2022 走看看