模块一 · 入门基础 / 第 05 课
05 · 位运算入门(能读懂就行)
学习目标
- 知道计算机里一切最终都是 0/1
- 会用 & | ^ ~ << >> 做简单运算
- 会「只改某一位」的常见写法
为什么要有位运算
普通运算是对「数值」整体做加减。位运算是直接对二进制的每一位做操作。
什么时候用?开关标志、权限位、压缩数据,以及以后接触硬件寄存器时。入门阶段先会算、会读即可。
六个运算符
| 运算符 | 干什么 | 口诀 |
|---|---|---|
& | 按位与:都 1 才 1 | 用来「保留/清零」某位 |
| | 按位或:有 1 则 1 | 用来「置 1」某位 |
^ | 按位异或:不同为 1 | 用来「翻转」某位 |
~ | 按位取反 | 0 变 1,1 变 0 |
<< >> | 左移右移 | 相当于乘/除 2 的 n 次方(近似) |
交互:亲手算一遍
先自己算,再点按钮核对。例如 60(二进制 00111100)和 13(00001101)。
8 位位运算实验台
结果会显示在这里
只改一位的通用写法
假设有一个 8 位状态 flags,想操作第 3 位(从 0 数):
#define BIT(n) (1 << (n))
flags |= BIT(3); // 把第3位设为 1
flags &= ~BIT(3); // 把第3位设为 0
flags ^= BIT(3); // 第3位翻转
if (flags & BIT(3))
{
// 第3位是 1
}
常用小技巧
| 目的 | 写法 |
|---|---|
| 取低 4 位 | x & 0x0F |
| 取高 4 位 | (x >> 4) & 0x0F |
| 是否偶数 | (n & 1) == 0 |
| 交换 a,b(不用临时变量) | a^=b; b^=a; a^=b; |
单片机场景 · 位运算:只修改目标位
设置、清零、翻转用不同操作。把掩码写成二进制,观察目标位与其他位。
边界与验证:结果 reg = 5(00000101),hi = 0。reg 是普通变量,不是真实寄存器;真实寄存器可能有写 1 清零、只读等语义,须查芯片手册。
unsigned char reg = 0;
unsigned char hi;
reg |= 0x01;
reg &= (unsigned char)~0x02u;
reg ^= 0x04;
hi = reg >> 4;
本课过关
必做要把 x 的某一位置 1、其它位不动,应写?
逐步解析
按位或 | 的规则是「对应位有 1 则 1」。BIT(n) 只有第 n 位是 1。x | BIT(n) 时:第 n 位原来是 0 会变成 1,原来是 1 仍为 1;其它位与 0 做或,保持原值。所以「只置 1 某一位」标准写法是 x |= BIT(n)。对比:x = BIT(n) 会把 x 整个覆盖,其它位全变 0;x &= BIT(n) 会把其它位清掉,只保留第 n 位——都不是「只改一位」。
必做作业
- 设 A=60,手工算 A & 15、A | 15,并用工具核对。
- 写出「清掉 flags 的 bit5」的表达式。
- 用位运算判断一个整数是否为偶数。
先自己写完,再点开看解答
1:60&15=12,60|15=63。
2:flags &= ~BIT(5);
3:if ((n & 1) == 0) 为偶数。
学完去哪
位会算了,下一课正式进入控制流程:if / else。