Base64编码本质是24位到4×6位的位重组,通过位移和掩码(如val>>18&0x3F)直接拆分,查静态表O(1)输出,不足3字节时补0并用长度判断填充'=',全程避开除法、字符串拼接与分支。

Base64 编码的本质是位重组,不是字符处理或算术运算。高效实现的关键,在于完全避开除法、取模、字符串拼接等开销操作,直接用原始类型的位移(>>)和掩码(&)完成 24 位到 4×6 位的精准拆分。
下面直击核心逻辑,不绕弯:
三字节合并为一个 24 位整数
每次读入 3 个字节 b0, b1, b2(对应内存中连续的 uint8),把它们按高位到低位拼成一个 24 位无符号整数:
- b0 → 占高 8 位(bit 16–23)
- b1 → 占中 8 位(bit 8–15)
- b2 → 占低 8 位(bit 0–7)
- 三者用 |(按位或)合并:val = (b0
从 24 位中提取四个 6 位索引
Base64 要求每组 6 位 → 索引范围 0–63,所以用 右移 + 0x3F 掩码 是唯一干净的做法:
- 第1字符索引:val >> 18 & 0x3F(取 bit 18–23)
- 第2字符索引:val >> 12 & 0x3F(取 bit 12–17)
- 第3字符索引:val >> 6 & 0x3F(取 bit 6–11)
- 第4字符索引:val & 0x3F(取 bit 0–5)
其中 0x3F = 0b00111111,确保只保留低 6 位,屏蔽高位干扰——这是防止越界查表错误的关键。
查表与填充处理必须零分支
定义静态字符表:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",索引直接作为数组下标访问,O(1) 无条件跳转。
剩余字节不足 3 个时(1 或 2 字节),仍执行相同位操作(补 0),但最后 1–2 个输出位置改写为 '=':
- 输入 1 字节 → 输出 4 字符,后两个为 '='
- 输入 2 字节 → 输出 4 字符,最后一个为 '='
- 用长度判断代替 if-else 嵌套,例如:
output[2] = (len == 1) ? '=' : table[idx2]
避免常见低效陷阱
- ❌ 不要用
div/mod计算索引(慢,且引入除零风险) - ❌ 不要逐 bit 构造(循环 6 次 × 4 组 → 24 次操作,远不如 4 次移位)
- ❌ 不要动态分配输出缓冲区(预计算长度:
(n + 2) / 3 * 4,栈上固定大小更稳) - ✅ 所有操作都在 uint32 或 uint64 内完成,无符号类型保障移位行为可移植











