请解释涉及指针运算与位运算的C代码中xmc[2]的操作逻辑
xmc[2]的二进制操作拆解
先明确核心前提:c是指向内存中32位数据的指针,*c表示当前指针指向的32位数据;*c++是先读取当前*c的值,再把指针c向后移动一个单位(指向内存中的下一个32位数据),这是你困惑的关键逻辑。
下面分两行拆解xmc[2]的二进制操作:
第一行:xmc[2] = (*c++ & 0x1) << 2;
& 0x1:0x1的二进制是000...0001,该操作取出当前*c的最低位(第0位,从右往左数第1位),其余位全部清零。<< 2:把取出的这一位左移2位,将其放到xmc[2]的第2位(二进制位从0开始计数)。- 执行完这行后,指针
c已指向内存中的下一个32位数据(后续操作的*c均指这个新数据)。
第二行:xmc[2] |= (*c >> 6) & 0x3;
>> 6:把新的*c的所有位右移6位,原数据的第6位、第7位会移动到新的第0位、第1位位置。& 0x3:0x3的二进制是000...0011,该操作取出右移后的低2位(即原新数据的第6、7位),其余位清零。|=:按位或操作,将取出的2位合并到xmc[2]中,最终xmc[2]的有效结构为:- 第2位:来自最初
*c的最低位 - 第1、0位:来自指针移动后新
*c的第7、6位 - 高位全部为0,最终是一个3位的有效数值。
- 第2位:来自最初
内容的提问来源于stack exchange,提问作者Builderhummel
相关产品推荐
相关产品推荐

