C 语言书
模块一 · 入门基础 / 第 05 课

05 · 位运算入门(能读懂就行)

进阶 30 分钟 跳到过关题
学习目标
  • 知道计算机里一切最终都是 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. 设 A=60,手工算 A & 15、A | 15,并用工具核对。
  2. 写出「清掉 flags 的 bit5」的表达式。
  3. 用位运算判断一个整数是否为偶数。
先自己写完,再点开看解答

1:60&15=12,60|15=63。

2:flags &= ~BIT(5);

3:if ((n & 1) == 0) 为偶数。