移位操作实例

本文介绍了在进行底层编程时遇到的16位数据存储到8位数组的问题。通过位移和位与操作,详细解释了如何正确地将16位数组元素拆分为高低八位并分别存储到8位数组中,避免数据丢失。核心步骤包括高八位右移并位与0xff,以及低八位直接位与0xff来保留有效数据。
摘要由CSDN通过智能技术生成

许久不用寄存器,写底层时候遇到个存储问题,移位懵逼了半天…

示例:

有这样两个数组
uint16_t 16_reg[i];
uint8_t  8_reg[j];
我们需要将16位数组中的一个元素存储到8位数组中去。
解答:
	8_reg[i]=16_reg[j]>>8 & 0xff;
	8_reg[i++]=16_reg[j] & 0xff;

解释:
在这里插入图片描述
左移8位后:
在这里插入图片描述
也就是说我们要把前八位放到8_reg[i]里面嘛,为啥要&0xff呢。
假如说这前八位数据前面有一个1会发生什么?

00000000 11111111
00100000 11111111

这样看是不是好理解,我要取11111111,如果前面有个1那不是就取成10000011.是不是出错了。所以:

00100000 11111111 & 0xff
0xff = 0000 0000 1111 1111
00100000 11111111 & 0000 0000 1111 1111 = 0000 0000 1111 1111
这样是不是就没有问题

接着看8_reg[i++]=16_reg[j] & 0xff;这句

上一步是不是已经把高八位取走了,这次我们只需要低八位,高八位是不是不用管了。

01000000 11111111 我们只要低八位
所以:01000000 11111111 & 00000000 11111111
给高八位清零只留下低八位不就ok了嘛
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值