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

C 语言从 0 入门(二十五)|位运算与位段:底层开发、嵌入式核心

大家好,我是网域小星球。

前面我们学习的运算,大多是面向日常逻辑的加减乘除、逻辑判断。而位运算是直接操作二进制比特位的运算,效率极高、占用内存极小,广泛用于:硬件开发、嵌入式、网络协议、权限标志、数据压缩、算法优化。

位段则可以精准控制变量占用比特位数,极致节省空间。本篇完整讲解 6 种位运算 + 位段用法,搭配实例、场景、经典算法,VS2022 直接运行。

目录

一、本章学习目标

二、二进制基础回顾

三、六大基础位运算

1. 按位与 &

2. 按位或 |

3. 按位异或 ^

4. 按位取反 ~

5. 左移 <<

6. 右移 >>

四、位运算完整示例(可直接运行)

五、位运算经典实用技巧

1. 不用临时变量交换两个整数

3. 指定位清零

4. 指定位置 1

六、位段(位域)精准内存控制

1. 什么是位段

2. 位段定义语法

注意事项

七、位运算 常见易错点

八、本章核心总结

下期预告

一、本章学习目标

  1. 掌握 6 大基础位运算:与、或、异或、取反、左移、右移
  2. 理解二进制底层逻辑,熟练位运算常用技巧
  3. 学会利用位运算:交换数字、判断奇偶、清零、置位、取反
  4. 掌握位段(位域)定义、使用与内存分配
  5. 了解位运算在项目、嵌入式、底层开发的实际应用

二、二进制基础回顾

计算机所有数据底层都是二进制 0 和 1

  • 1 个比特位 = 1bit
  • 1 字节 = 8bit位运算,就是直接对每一个二进制位进行操作。

三、六大基础位运算

1. 按位与&

规则:同一位置都为 1,结果才是 1,否则为 0用途:清零、保留指定位、判断奇偶

// 奇数二进制最后一位一定是1 if(n & 1) { printf("奇数"); }

2. 按位或|

规则:有 1 则 1,全 0 才 0用途:固定位置置 1、组合标志位

3. 按位异或^

规则:相同为 0,不同为 1经典特性:

  1. 任何数异或自身 = 0
  2. 任何数异或 0 = 本身用途:不使用临时变量交换两个数、简单加密

4. 按位取反~

规则:0 变 1,1 变 0注意:涉及补码运算,日常使用较少,多用于底层掩码

5. 左移<<

a << n:整体二进制向左移动 n 位,右侧补 0等价快速运算:乘以 2 的 n 次方

6. 右移>>

a >> n:整体二进制向右移动 n 位

  • 正数:左侧补 0等价快速运算:除以 2 的 n 次方(向下取整)

四、位运算完整示例(可直接运行)

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int a = 5; // 0101 int b = 3; // 0011 printf("a & b = %d\n", a & b); // 0001 1 printf("a | b = %d\n", a | b); // 0111 7 printf("a ^ b = %d\n", a ^ b); // 0110 6 printf("a << 1 = %d\n", a << 1);// 1010 10 printf("a >> 1 = %d\n", a >> 1);// 0010 2 return 0; }

五、位运算经典实用技巧

1. 不用临时变量交换两个整数

int x = 10, y = 20; x = x ^ y; y = x ^ y; x = x ^ y;

2. 快速判断奇偶

if(x & 1) printf("奇数"); else printf("偶数");

3. 指定位清零

配合掩码&实现固定位清零

4. 指定位置 1

配合掩码|实现标志位开启


六、位段(位域)精准内存控制

1. 什么是位段

普通变量最小占用 1 字节(8bit)位段允许自定义成员占用多少个bit,大幅节省内存。

适用场景:协议报文、硬件寄存器、状态标记、大量短状态存储

2. 位段定义语法

struct 结构体名 { 类型 成员名 : 比特位数; };

3. 基础示例

// 只用 3+4+1 位,极度节省空间 struct Flag { unsigned int a : 3; // 占3位 unsigned int b : 4; // 占4位 unsigned int c : 1; // 占1位 };

4. 位段使用

struct Flag f; f.a = 5; f.b = 10; f.c = 1;

注意事项

  1. 位段不能取地址&
  2. 跨编译器内存排布可能不同,不适合跨平台
  3. 位数不能超过当前类型最大比特数

七、位运算 常见易错点

  1. 混淆逻辑与 &&按位与 &逻辑或 ||按位或 |
  2. 移位运算负数规则不同,开发中尽量只对正数移位
  3. 异或交换变量仅适用于整数,不能用于浮点数
  4. 位段跨平台兼容性差,项目通用数据尽量少用
  5. 忽略补码规则,误用按位取反~

八、本章核心总结

  1. 位运算直接操作二进制位,效率极高,底层开发必备
  2. &清零判断、|置位、^异或交换 / 加密、<< >>快速乘除
  3. 异或三大特性:归零、不变、交换数据
  4. 位段可以按 bit 分配内存,适合硬件、协议、状态标记
  5. 位运算是算法、嵌入式、网络编程、驱动开发的基础技能

下期预告

整合全书所有知识点:数组、指针、结构体、动态内存、文件操作、菜单框架,做成功能完整、可直接上交作业 / 课程设计的成品项目。

http://www.jsqmd.com/news/650887/

相关文章:

  • 如何在Intel GPU上免费运行CUDA应用:ZLUDA完整配置教程
  • 盘点2026年值得推荐的路侧边边缘计算盒子厂家,适配多行业需求 - 品牌2026
  • 忍者像素绘卷快速上手:无需代码,微信小程序直连云端画坊生成绘卷
  • 当终端变成“编辑器“:VSCode 这个小改动,竟是 AI 时代的神助攻?
  • 2025届最火的六大降AI率助手实际效果
  • TrafficMonitor插件完全指南:5步打造个性化桌面监控系统终极教程
  • 别再傻傻用FFT了!用MATLAB的CZT函数实现频谱局部‘显微镜’(附完整代码)
  • 【AI大模型】Vosk离线语音识别模型详细介绍及实现
  • 天赐范式第13天:说些打造范式那几天碰到的一点趣事,整些幺蛾子,给大家换换脑子。
  • auto和decltype的区别
  • 【人工智能】Deepseek 专家模式 与 快速模式的差别?
  • 2小时完成本地部署OpenClaw新手友好!Cherry Studio+Ollama Cloud每周可免费使用约5次OpenClaw任务
  • 为什么已提交的数据一定存在于多数节点
  • 系统恢复与磁盘克隆:Rescuezilla 完全使用指南
  • 终极指南:如何免费延长JetBrains IDE试用期的完整解决方案
  • [ARC147F] Again ABC String 题解
  • 如何快速上手TimesFM:谷歌时间序列基础模型的完整实战指南
  • Harbor 2.8+ 弃用ChartMuseum后,如何用OCI规范管理Helm Charts?
  • 专业术语统计报告_基于复杂适应系统理论的多能源电力系统电源优化规划研究
  • AD9280 ADC模块原理图设计,已量产
  • 2026 托福机构排名 TOP5|大学生在职人士首选指南 - 速递信息
  • 2025最权威的六大降重复率工具推荐
  • 2026一体化预制泵站采购指南:行业头部三大厂商全方位横向评测 - 泵站报价15613348888
  • 微信小程序全局音频管理实战:防止创建多个InnerAudioContext实例
  • 大模型应用开发实战(13)——多 Agent 真的有必要吗?LangGraph 背后的分工逻辑拆解
  • 探索Intel NPU加速库:解锁AI硬件潜能的三步实战指南
  • 【算法刷题指南】从零开始的LeetCode系统训练(持续更新 分类索引)
  • OpenClaw飞书消息发送图片的坑:filePath 路径导致的显示差异
  • Linux 帮助手册与用户管理完全指南
  • 离心泵CAE_2_ICEM结构化网格划分实战