按位读写16位数据

9 篇文章 1 订阅
4 篇文章 0 订阅

将数据按内存读写,不关心存储的值在10进制中表现为什么,仅关心其在内存中的表现,直接使用位操作符,实现数据的按位读写。

读取给定数据value中,自起始位begin开始的count个位,返回读取到的数据:

unsigned short readBit(unsigned short value, int begin, int count)
{
    if(begin+count-1 > 16)
        return 0;//首先保证取值范围不会越界
    begin = begin-1;//外部从1开始,内部从0开始
    if(begin < 0 || count < 1 || count > 16)//7位16-1得到最大索引
        return 0;
    unsigned short tmp = 0xffff;
    unsigned short off = 16-count;
    tmp <<= off;//先左移,得到需要取的位数位置
    off = off-begin;
    tmp >>= off;//再右移,则得到取起始位
    unsigned short ret = value & tmp;
    ret >>= begin;

    return ret;
}
以给定的数据value,更改原数据src中,自begin位开始的共count个位,返回修改后的数据:
unsigned short writeBit(unsigned short value, int begin, int count, unsigned short src)
{
    if(begin+count-1 > 16)
        return 0;//首先保证取值范围不会越界
    begin = begin-1;//外部从1开始,内部从0开始
    if(begin < 0 || count < 1 || count > 16)//7位16-1得到最大索引
        return 0;
    unsigned short max = qPow(2,count)-1;//幂函数,取得2的n次方的最大值
    if(value > max)
        value = max;//最大值,避免其它位被意外修改
    unsigned short tmp = 0xffff;
    unsigned short off = 16-count;
    tmp <<= off;//先左移,得到需要取的位数位置
    off = off-begin;
    tmp >>= off;//再右移,则得到取起始位
    tmp = ~tmp;
    unsigned short srcTmp = tmp & src;
    value <<= begin;
    unsigned short ret = value | srcTmp;

    return ret;
}
原本之前有过一次尝试,但发现之前的写法理解得还不透彻,使用不合理,故而重新思考后而得。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值