人本善良

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

与 和位移运算的原理

复制代码
(`&`)**和**位移运算(`>>`)**的逻辑,并通过示例展示每一步的计算过程。

---

### 1. **与运算(`&`)**
- **作用**:提取一个数的低8位(最低有效字节)。
- **原理**:`0xFF` 的二进制形式是 `00000000 11111111`,与一个16位数进行与运算时,会保留低8位,高8位被清零。

**公式:**
```
低8位 = 数值 & 0xFF
```

**示例:**
假设 `registers[0] = 0x1234`(16进制),其二进制形式为:
```
00010010 00110100
```
与 `0xFF` 进行与运算:
```
00010010 00110100  (0x1234)
&
00000000 11111111  (0xFF)
=
00000000 00110100  (0x34)
```
结果:`0x34`。

---

### 2. **右移运算(`>>`)**
- **作用**:将一个数的高8位(最高有效字节)右移到低8位。
- **原理**:右移8位会将高8位移动到低8位的位置,高8位补0。

**公式:**
```
高8位 = 数值 >> 8
```

**示例:**
假设 `registers[0] = 0x1234`,其二进制形式为:
```
00010010 00110100
```
右移8位:
```
00010010 00110100  (0x1234)
>> 8
=
00000000 00010010  (0x12)
```
结果:`0x12`。

---

### 3. **完整代码逻辑**
以下是代码的完整逻辑,结合与运算和右移运算:

#### **(1) `bytes[0] = (byte)(registers[0] & 0xFF);`**
- 提取 `registers[0]` 的低8位。
- 示例:`registers[0] = 0x1234`,结果为 `0x34`。

#### **(2) `bytes[1] = (byte)(registers[0] >> 8);`**
- 提取 `registers[0]` 的高8位。
- 示例:`registers[0] = 0x1234`,结果为 `0x12`。

#### **(3) `bytes[2] = (byte)(registers[1] & 0xFF);`**
- 提取 `registers[1]` 的低8位。
- 示例:`registers[1] = 0x5678`,结果为 `0x78`。

#### **(4) `bytes[3] = (byte)(registers[1] >> 8);`**
- 提取 `registers[1]` 的高8位。
- 示例:`registers[1] = 0x5678`,结果为 `0x56`。

---

### 4. **完整示例**
假设:
- `registers[0] = 0x1234`
- `registers[1] = 0x5678`

按照代码逻辑计算:

#### **(1) `bytes[0]`**
```
registers[0] & 0xFF = 0x1234 & 0xFF = 0x34
```

#### **(2) `bytes[1]`**
```
registers[0] >> 8 = 0x1234 >> 8 = 0x12
```

#### **(3) `bytes[2]`**
```
registers[1] & 0xFF = 0x5678 & 0xFF = 0x78
```

#### **(4) `bytes[3]`**
```
registers[1] >> 8 = 0x5678 >> 8 = 0x56
```

最终 `bytes` 数组的内容为:
```
bytes = [0x34, 0x12, 0x78, 0x56]
```

---

### 5. **总结**
- **与运算(`&`)**:用于提取低8位。
- **右移运算(`>>`)**:用于提取高8位。
- 通过这两种运算,可以将16位寄存器的值分解为两个8位字节,并按照小端序排列到字节数组中。

**最终结果:**
- 输入:两个16位寄存器(`registers[0]` 和 `registers[1]`)。
- 输出:一个4字节的字节数组(`bytes`),内容为 `[低8位, 高8位, 低8位, 高8位]`。
复制代码

 

posted on   简简单单2018  阅读(7)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示