嵌入式开发学习日志(位运算、程序调试GDB) day16 持续更新中

📅 2026/8/10 18:39:33
嵌入式开发学习日志(位运算、程序调试GDB) day16 持续更新中
摘要本文深入解析了C语言中高效且底层的位运算技巧包括基本的位逻辑运算、移位运算及其在置位、清零、变量交换等场景下的经典应用。同时介绍了Linux环境下强大的程序调试工具GDB涵盖从编译配置到常用指令的完整调试流程。适合希望提升代码性能及掌握底层调试技能的开发者阅读。1. 位运算基础位运算直接对整数在内存中的二进制位进行操作是嵌入式开发和底层系统编程的核心技能。1.1 基本运算符运算符名称规则备注按位与全1为1有0则0常用于“掩码”操作提取特定位按位或有1则1全0为0^按位异或相同为0相异为1常用于数据加密、无临时变量交换~按位取反1变00变1单目运算符左移低位补0num n等价于num * 2^n右移高位补符号位(有符号)或0(无符号)num n等价于num / 2^n(取整)1.2 运算实例演示以数字9(...0000 1001) 和6(...0000 0110) 为例按位与 (9 6):0000 ... 1001 0000 ... 0110 ---------------- 0000 ... 0000 (结果0)按位或 (9 | 6):0000 ... 1001 | 0000 ... 0110 ---------------- 0000 ... 1111 (结果15)按位异或 (9 ^ 6):0000 ... 1001 ^ 0000 ... 0110 ---------------- 0000 ... 1111 (结果15)按位取反 (~9):~ 0000 ... 1001 ---------------- 1111 ... 0110 (结果为补码形式对应十进制 -10)左移 (9 3):0000 ... 1001 3 ---------------- 0000 ... 0100 1000 (结果72即 9 * 8)右移 (9 3):0000 ... 1001 3 ---------------- 0000 ... 0001 (结果1即 9 / 8 取整)2. 位运算的高级应用在实际开发中位运算常用于寄存器配置和状态标志位管理。2.1 指定第 n 位置 1原理利用|(或) 运算的特性任何数与1或都为1与0或不变。公式num num | (1 n);示例将二进制数1010 0000的第3位置1。构造掩码1 3得到0000 1000执行或运算1010 0000 | 0000 1000 ----------- 1010 10002.2 指定第 n 位清 0原理利用(与) 运算的特性任何数与0与都为0与1与不变。我们需要构造一个除了第n位是0其他位全是1的数。公式num num (~(1 n));示例将二进制数1010 1010的第3位清0。构造掩码1 3-0000 1000- 取反~-1111 0111执行与运算1010 1010 1111 0111 ----------- 1010 00102.3 两数交换不使用中间变量利用异或运算的性质a ^ a 0a ^ 0 a。// 经典三步法 a a ^ b; b a ^ b; // 此时 b (a ^ b) ^ b a ^ (b ^ b) a ^ 0 a a a ^ b; // 此时 a (a ^ b) ^ a (a ^ a) ^ b 0 ^ b b对比其他方式中间变量法最通用可读性最好。加减法aab; ba-b; aa-b;(存在溢出风险)。异或法无需额外空间无溢出风险但在现代编译器优化下速度未必快于中间变量法且可读性较差。2.4 运算符优先级记忆口诀~ ^|(注算术运算符通常高于位移运算符位移高于位逻辑运算符)3. 程序调试方法 (GDB)当代码逻辑复杂出现 Bug 时单纯的printf往往效率低下。掌握 GDB (GNU Debugger) 是 Linux C/C 开发的必修课。3.1 调试方法概览打印调试在代码关键位置插入printf(num %d\n, num);观察变量值。简单粗暴但需重新编译且容易遗漏。GDB 调试动态跟踪程序运行查看内存、堆栈、变量是解决段错误 (Segmentation Fault) 和逻辑错误的利器。3.2 GDB 使用流程第一步编译必须加上-g选项生成包含调试信息的可执行文件。gcc main.c -g -o my_app第二步启动gdb ./my_app第三步常用指令速查表指令全称/含义说明llist列出源代码方便定位b 行号break在指定行号打断点 (如b 10)rrun运行程序直到遇到断点或结束nnext单步执行不进入函数内部sstep单步执行会进入函数内部p 变量名print打印当前变量的值wherebt (backtrace)查看函数调用栈定位段错误崩溃位置的神器qquit退出 GDB3.3 典型应用场景调试逻辑错误使用b打断点r运行n单步走p随时查看变量是否符合预期。调试段错误 (Segmentation Fault)程序崩溃后直接在 GDB 中输入where或bt它会直接告诉你程序死在哪一行以及当时的函数调用关系。