在单片机、寄存器开发中,二进制和十六进制是你每天都要打交道的东西。别被它们吓到,其实**十六进制就是给人类看的二进制简写版**。
因为写一长串 `00101000` 很容易眼花数错,所以工程师发明了十六进制来偷懒。
下面我用最通俗的方式,教你彻底搞懂它们之间的转换。
一、 核心黄金法则:4位二进制 = 1位十六进制
这是所有的核心!记住这一条就够了。
* 二进制只有 `0` 和 `1`(逢二进一)。
* 十六进制有 `0-9` 以及 `A-F`(逢十六进一)。
* 因为 \(2^4 = 16\),所以**刚好 4 个二进制位,完美对应 1 个十六进制位**。
在寄存器(8位)里,正好可以分成**两半**:
`高4位 低4位` ➡️ 对应 ➡️ `1个16进制字符 1个16进制字符`
二、 必须背下来的"4位对照表"
初学时,你可以直接查表。熟练后就能一眼看穿:
| 十六进制 | 二进制 (4位) | 记忆窍门 |
| :--- | :--- | :--- |
| **0** | `0000` | 全 0 |
| **1** | `0001` | 只有最右边是 1 |
| **2** | `0010` | |
| **3** | `0011` | 1+2=3 |
| **4** | `0100` | |
| **5** | `0101` | 4+1=5 |
| **6** | `0110` | 4+2=6 |
| **7** | `0111` | 4+2+1=7 |
| **8** | `1000` | |
| **9** | `1001` | 8+1=9 |
| **A (10)** | `1010` | 8+2=10 |
| **B (11)** | `1011` | 8+2+1=11 |
| **C (12)** | `1100` | 8+4=12 |
| **D (13)** | `1101` | 8+4+1=13 |
| **E (14)** | `1110` | 8+4+2=14 |
| **F (15)** | `1111` | 全 1 |
三、 怎么把二进制转成十六进制?(分组法)
**口诀:从右往左,四位一组,不够补零,各自转换。**
**实战案例 1:** 我们之前算出来的配置 `0010 1000`
-
**分组**:已经4位一组分好了(如果没分好,就从右向左每4位划一条线)。
-
**查表/计算**:
* 左边 `0010` = **2**
* 右边 `1000` = **8**
- **拼起来**:结果就是 **`0x28`**。
**实战案例 2:** 寄存器默认值 `0110 1011`
-
**分组**:`0110` 和 `1011`
-
**转换**:
* `0110` = 4+2 = **6**
* `1011` = 8+2+1 = **B** (11)
- **拼起来**:结果就是 **`0x6B`**。(巧了,这就是 PWR_MGMT_1 的寄存器地址)。
**实战案例 3:** 只有 7 位的二进制 `101 1100` (比如某传感器数据)
-
**补零分组**:从右往左四位一组,左边不够补零,变成 `0101` 和 `1100`。
-
**转换**:
* `0101` = **5**
* `1100` = **C** (12)
- **拼起来**:结果就是 **`0x5C`**。
四、 怎么把十六进制转回二进制?(拆解法)
写代码时,你看到手册上的 `0x28`,要立刻能反推出它是哪几个位被置 1 了。
**口诀:一位拆四位。**
**实战案例:** 看到 `0xBC`
-
**拆解**:`B` 和 `C`
-
**各自展开**:
* `B` (11) = `1011` (8+2+1)
* `C` (12) = `1100` (8+4)
- **拼起来**:`1011 1100`。
*(注意:看到 `0x` 开头,就代表这是十六进制数,这是语法约定,不用参与转换)*
💡 硬核口算技巧(权重法)
不想查表怎么快速算?看这 4 个数字的权重:**8、4、2、1**(从左到右)。
比如拿到二进制 `1101`:
* 第1位是 1,代表 **8** (加上)
* 第2位是 1,代表 **4** (加上)
* 第3位是 0,代表 2 (不要)
* 第4位是 1,代表 **1** (加上)
* 结果:8 + 4 + 1 = **13**(也就是十六进制的 **D**)。
反过来,要转 `0x9`(即十进制的9):
9 = 8 + 1,所以第1位(8)和第4位(1)是1,中间两位是0 ➡️ **`1001`**。
📝 结合 MPU6050 的实战复习
假设你写代码时,想**同时开启睡眠(Bit6=1),开启循环(Bit5=1)**,其他全为0:
* 二进制:`0110 0000`
* 分两半:
* 左边 `0110` = 4+2 = **6**
* 右边 `0000` = **0**
* 十六进制:**`0x60`**
假设你读了寄存器 `0x6B` 的值,发现是 **`0x41`**:
* 拆开:`4` 和 `1`
* 展开:`0100 0001`
* 对照手册:Bit6 是 1(在睡眠),Bit0 是 1(时钟选 X 轴)。
只要你把上面那张 **"4位对照表"** 放在手边,或者心里默念 **8,4,2,1** 的权重,90% 的转换你 3 秒钟就能在脑子里完成!