许久不用寄存器,写底层时候遇到个存储问题,移位懵逼了半天…
示例:
有这样两个数组
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了嘛