#位运算# #Linux调试# #GDB#
前言
本篇笔记梳理C语言底层核心位运算全部考点,同时配套Linux开发必备的GDB调试工具完整操作指南。位运算常用于嵌入式底层寄存器操作、数据加密、数值交换;GDB是定位段错误、逻辑bug的核心工具,期末笔试、嵌入式面试均高频考察,内容精简贴合考试与实操需求。
一、位运算符基础
1. 六大位运算规则
运算符 名称 运算规则
& 按位与 全1出1,有0出0
| 按位或
^ 按位异或 二进制位相同为0,相异为1
~ 按位取反 1变0,0变1,唯一单目位运算符
<< 左移 整体左移n位,低位补0,等价乘以
>> 右移 无符号数高位补0;有符号数高位补符号位,等价除以
2. 位运算优先级(从高到低)
~ > << 、 >> > & > ^ > |
注意:位运算优先级低于加减乘除,复杂表达式建议手动加括号避免逻辑错误。
二、位运算经典实操代码(考试必考)
1. 数字指定二进制位置置1
// 将num的第n位设置为1,其余位保持不变
num = num | (1 << n);
原理: 1 << n 构造掩码,仅第n位为1,或运算强制置1。
2. 数字指定二进制位清0
// 将num的第n位设置为0,其余位保持不变
num = num & ~(1 << n);
原理: ~(1 << n) 构造掩码,仅第n位为0,与运算强制清0。
3. 不借助中间变量交换两个整数
方案1:异或法(推荐,无溢出)
a = a ^ b;
b = a ^ b;
a = a ^ b;
方案2:加减法(存在大数溢出缺陷)
a = a + b;
b = a - b;
a = a - b;
三、程序调试两种方案
1. printf打印调试(简易入门)
在代码关键流程插入 printf() 打印变量、执行标记,通过输出内容判断程序运行逻辑。
优点:无需额外工具,上手零成本;
缺点:复杂程序需要频繁增删打印语句,调试效率低。
2. GDB调试工具(Linux嵌入式必备)
GDB是GNU官方开源代码调试工具,专门用于定位逻辑错误、段错误。
(1)编译带调试信息程序
编译时追加 -g 参数,向可执行文件写入源码调试信息:
gcc main.c -g
(2)启动GDB
gdb ./a.out
(3)核心常用指令汇总
指令 全称 功能
l list 查看程序源代码
b 行号 break 在指定代码行设置断点
r run 从头运行程序,遇到断点暂停
n next 单步执行下一行,不进入函数内部
s step 单步执行,跟进函数内部代码
p 变量名 print 实时查看当前变量存储的值
where - 定位段错误崩溃的代码位置
q quit 退出GDB调试终端
(4)两大适用场景
1. 排查逻辑错误:单步跟踪变量变化,定位判断、循环逻辑漏洞;
2. 排查段错误:空指针、数组越界、非法内存访问,使用 where 一键定位崩溃行。
小结
1. 位运算核心:移位实现乘除2、与或异或实现二进制位修改,异或交换数字是笔试高频编程题;
2. 移位区分有符号/无符号数据,负数右移高位补符号位,左移低位统一补0;
3. 调试分两种方式:简单程序用printf打印,Linux嵌入式开发必须掌握GDB;
4. GDB使用前提:编译添加 -g 参数,核心指令记住断点、单步、打印变量、定位崩溃四大功能。