16位整数分解两个字节传输

乐活   2025-02-08 13:04   内蒙古  

MCU寄存器的位运算方式(读写+拼接字节数据) 昨天这篇文章的末尾讲了一个字节分割的demo,我个人回顾的时候是没有讲透的。

uint16_t regValue;uint8_t regData[2];regData[0] = data >> 8;regData[1] = data & 0xFF;

将一个16位的整数 data 分解成两个8位的部分,分别存储在 regData[0] 和 regData[1] 中。

regData[0] 存储 data 的高8位,regData[1] 存储 data 的低8位。

regData[0] = data >> 8;
data >> 8 表示将 data 右移8位。
data 是一个16位的整数,二进制表示为 b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
为什么要分割?因为MCU里面是按照字节传输的,所以我们需要分解操作。
右移8位后,data 的高8位 b15 b14 b13 b12 b11 b10 b9 b8 会移动到低8位的位置,高8位会被填充为0。
因此,regData[0] 存储的是 data 的高8位。
regData[1] = data & 0xFF;
0xFF 是一个8位的掩码,二进制表示为 00000000 11111111
data & 0xFF 表示将 data 与 0xFF 进行按位与操作。
按位与操作会保留 data 的低8位 b7 b6 b5 b4 b3 b2 b1 b0,而高8位会被置为0。
因此,regData[1] 存储的是 data 的低8位。

来实际的计算一下:

假设 data 的值为 0xABCD(16进制),对应的二进制表示为 10101011 11001101
计算 regData[0]
data >> 8 将 10101011 11001101 右移8位,得到 00000000 10101011。
因此,regData[0] 的值为 0xAB(16进制)。
计算 regData[1]
data & 0xFF 将 10101011 11001101 与 00000000 11111111 进行按位与操作,得到 00000000 11001101。
因此,regData[1] 的值为 0xCD(16进制)。

也就是分成了0xAB 和 0xCD

云深之无迹
纵是相见,亦如不见,潇湘泪雨,执念何苦。
 最新文章