【C++位运算】用一个32位的数实现两个16位数的互不干扰存取

 有一个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;
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值