格雷编码¶
什么是格雷编码?¶
格雷编码(Gray Code)是一种相邻数值之间只有 1 个二进制位不同的编码方式。它常用于旋转编码器、硬件电路、通信采样等场景。
CTF 中如果看到一组二进制数相邻项只变化一位,或者题目提示 Gray、格雷、反射二进制码,就可以考虑格雷编码。
格雷码特点¶
- 相邻两个编码只有 1 bit 不同。
- 可以减少状态切换时的误读。
- 常见的是二进制反射格雷码(Binary Reflected Gray Code)。
例如 0 到 7 的 3 bit 格雷码:
| 十进制 | 二进制 | 格雷码 |
|---|---|---|
| 0 | 000 | 000 |
| 1 | 001 | 001 |
| 2 | 010 | 011 |
| 3 | 011 | 010 |
| 4 | 100 | 110 |
| 5 | 101 | 111 |
| 6 | 110 | 101 |
| 7 | 111 | 100 |
二进制转格雷码¶
规则:
手算时可以这样理解:
- 格雷码第一位等于二进制第一位。
- 从第二位开始,每一位等于当前二进制位与前一位二进制位异或。
例如二进制 1011:
| 位置 | 二进制位 | 前一位 | 异或结果 |
|---|---|---|---|
| 1 | 1 | 无 | 1 |
| 2 | 0 | 1 | 1 |
| 3 | 1 | 0 | 1 |
| 4 | 1 | 1 | 0 |
所以:
格雷码转二进制¶
规则:
- 二进制第一位等于格雷码第一位。
- 从第二位开始,二进制当前位等于“前一位二进制位”和“当前格雷码位”异或。
例如格雷码 1110:
| 位置 | 格雷码位 | 前一位二进制 | 二进制位 |
|---|---|---|---|
| 1 | 1 | 无 | 1 |
| 2 | 1 | 1 | 0 |
| 3 | 1 | 0 | 1 |
| 4 | 0 | 1 | 1 |
得到:
Python 示例¶
def binary_to_gray(n):
return n ^ (n >> 1)
def gray_to_binary(g):
n = g
while g >> 1:
g >>= 1
n ^= g
return n
print(bin(binary_to_gray(0b1011))) # 0b1110
print(bin(gray_to_binary(0b1110))) # 0b1011
CTF 识别要点¶
- 题目提示 Gray、格雷码、反射二进制码。
- 给出一串固定长度二进制块,例如
011 010 110 111。 - 解码后通常还需要转十进制、ASCII 或继续处理。
- 如果结果不对,检查是否需要按固定 bit 长度补零。