有一个uint_t的数据和一个int16的数据,存储空间只有一个int,需要把两个拼凑成一个,有两个方法:
方法一:
使用了异或运算,将需要更改的位清零,变动了数据的连续性,打破了负数的存储规则,所以专门用了一位来区分正负
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <cmath>
uint8_t label ;
int16_t height ;
int val;
int main()
{
label = 10;
printf("new label is: %d\n",label);
//存label
val = val ^ (((val >>16) &0xFF)<<16);
val |=(label<<16);
printf("val is: %x\n",val);
height = -120;
printf("new height is: %d\n",height);
//存height的符号
if(height<0)
{
val |=(1<<24);
}
else
{
val |=(0<<24);
}
//存height的绝对值
val = val ^ (val & 0xFFFF);
val |=abs(height);
height = val & 0xFFFF;
if(((val>>24) &1)==1)
{
height= -height;
}
printf("pull data,then height is : %d\n",height);
label = (val >>16) &0xFF;
printf("pull data,then label is: %d\n",label);
方法二:
不管正负,反正就是那么多位,直接通过&的方式擦除,通过 | 的方式更新进去
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <cmath>
uint8_t label ; //待存的两个值
int16_t height ;
int val; //存储空间
int main()
{
height = -100;
printf("new height is: %d\n",height);
label = 12;
printf("new label is: %d\n",label);
//存height
val = (val & ~0xFFFF) | height;
//存label
val = (val & 0xFFFF)|(label<<16);
//取label
label = (val>>16) & 0xFFFF;
printf("pull data,then label is %d\n",label);
//取height
height = val & 0xFFFF;
printf("pull data,then height is : %d\n",height);
return 0;
}