当前位置: 首页 > news >正文

C语言基础笔记——位操作

基础知识

1. 位运算概述

在这里插入图片描述

2. 位运算概览

在这里插入图片描述

3. 按位与运算符(&)

在这里插入图片描述

4. 按位或运算符(|)

在这里插入图片描述

5. 异或运算符(^)

在这里插入图片描述

6. 取反运算符(~)

在这里插入图片描述

7. 左移运算符(<<)

在这里插入图片描述

8. 右移运算符(>>)

在这里插入图片描述

9. 复合赋值运算符

在这里插入图片描述

位运算示例:

假设有定义uint8_t a = 3,b = 5;
a&b = 1; a|b = 7; a^b =6; ~a=0b 1111 1100; a>>1 == 1; b<<2 = 20;


在单片机中的应用

在单片机软件开发中,位操作是硬件寄存器控制和资源优化的核心手段。

一、常用位操作

1.基本位操作

在这里插入图片描述

2. 多比特操作

在这里插入图片描述

3. 移位操作

在这里插入图片描述

二、在寄存器中的运用

寄存器配置要点:
对寄存器进行配置时,通常有两种方式:

  1. 先将带设置的位清0,然后再设置对应的值
  2. 先将寄存器的值读出来,修改完成后,再写回去
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

三、代码技巧

1. 使用宏定义寄存器地址和位掩码

// 定义寄存器地址(假设PORTB地址为0x25)
#define PORTB (*(volatile uint8_t*)0x25)
// 定义位掩码
#define LED_PIN  (1 << 5)  // PB5
#define BUTTON_PIN (1 << 2) // PB2// 使用示例
PORTB |= LED_PIN;     // 点亮LED
if (PORTB & BUTTON_PIN) { /* 按钮按下 */ }

2. 位域结构体(用于寄存器映射)

typedef struct {uint8_t mode  : 2;  // 低2位:模式配置uint8_t enable : 1;  // 第2位:使能位uint8_t        : 3;  // 匿名位域填充(保留未用)uint8_t error  : 2;  // 高2位:错误码
} ControlReg;volatile ControlReg* pReg = (volatile ControlReg*)0x4000;
pReg->enable = 1;  // 直接操作寄存器位

3. 联合体(Union)与位操作

结合联合体和结构体,实现灵活的数据访问:

typedef union {uint16_t value;       // 整体值struct {uint8_t low;      // 低字节uint8_t high;     // 高字节};struct {uint8_t bit0 : 1;  // 按位访问// ... 其他位定义};
} DataReg;DataReg reg;
reg.value = 0x1234;
reg.high = 0xAB;  // 修改高字节
if (reg.bit0) {   // 检查第0位// ...
}

4. 内联函数或宏封装常用操作

// 宏封装置位和清零
#define SET_BIT(reg, bit)   ((reg) |= (1 << (bit)))
#define CLEAR_BIT(reg, bit) ((reg) &= ~(1 << (bit)))// 内联函数判断位状态
static inline bool IsBitSet(volatile uint8_t* reg, uint8_t bit) {return (*reg & (1 << bit)) != 0;
}

四、注意事项

在这里插入图片描述

五、典型应用场景

在这里插入图片描述
合理使用位操作可显著提升单片机代码的效率和可维护性,但需结合硬件手册和实际场景谨慎设计。

练习题链接:位操作练习


参考链接:
菜鸟编程:位运算
C语言基本笔记(6)—— 位操作
参考视频:
1.2STM32入门_寄存器配置中的位运算

http://www.lryc.cn/news/589820.html

相关文章:

  • 虚幻引擎5 GAS开发俯视角RPG游戏 #06-7:无限游戏效果
  • 使用EF Core修改数据:Update方法与SaveChanges的深度解析
  • 前端性能追踪工具:用户体验的毫秒战争
  • Kiro:亚马逊云发布,革命性AI编程工具!以“规范驱动开发“重塑软件构建范式!
  • es启动问题解决
  • Java数据结构第二十五期:红黑树传奇,当二叉树穿上 “红黑铠甲” 应对失衡挑战
  • 树莓派系统安装
  • GENERALIST REWARD MODELS: FOUND INSIDE LARGELANGUAGE MODELS
  • Java对象的比较
  • 【ArcGISPro】修改conda虚拟安装包路径
  • C++ 计数排序、归并排序、快速排序
  • 图机器学习(10)——监督学习中的图神经网络
  • 【AI智能体】Dify 基于知识库搭建智能客服问答应用详解
  • AdsPower 功能详解 | 应用中心使用指南:插件统一管理更高效、更安全!
  • 医疗AI“全栈原生态“系统设计路径分析
  • Win11专业工作站版安装配置要求
  • 力扣每日一题--2025.7.16
  • MAC 苹果版Adobe Photoshop 2019下载及保姆级安装教程!!
  • 第六章 OBProxy 路由与使用运维
  • 【基于PaddlePaddle训练的车牌识别系统】
  • http协议学习-1
  • vue的provide和inject
  • 基于 Docker 环境的 JupyterHub 详细部署手册
  • 论文导读--PQ3D:通过分段级分组实现多模态特征融合和 MTU3D:在线查询表示学习与动态空间记忆
  • cell2location复现
  • xss-labs练习
  • Android-EDLA【CTS】CtsTetheringTest存在fail
  • 探究Netty 4.2.x版本
  • 动态规划题解——分割等和子集【LeetCode】
  • Spring Boot 整合 Nacos 实战教程:服务注册发现与配置中心详解