二进制数据存储

二进制数据存储

Table of Contents

1 问题

编写一个函数,把一个给定的值存储到一个整数中指定德几个位,它的原型如下:

int store_bit_filed(int orginal_value,int value_to_store,unsigned starting_bit,unsigned ending_bit);

假定整数中的位是从右向左进行编号。startingbit是偏小的整数,endingbit是偏大的整数。

为了更清楚地说明,函数应该返回下列值:

原始值需要存储的值起始位结束位返回值
0x00x1440x10
0xffff0x1234150x123f
0xffff0x1239130xc7ff

2 解析

  1. 创建一个掩码(mask),它是一个值,其中需要存储的位置相对应德那几个位设置为1,此 时掩码为0011 1110 0000 0000。
  2. 用掩码的反码对原值执行AND操作,将那几个位设置为0,原值为1111 1111 1111 1111, 操作后变为1100 0001 1111 1111。
  3. 将新值左移,使它与那几个需要存储德位对齐。新值0000 0001 0010 0011(0x123),左 移后变为0100 0110 0000 0000。
  4. 把移位后德值与掩码进行位AND操作,确保除那几个需要存储德位之外德其余位都设置为 0,进行这个操作后,值变为0000 0110 0000 0000。
  5. 把结果值与原值进行位OR操作,结果为1100 0111 1111 1111(0xc7ff)。

3 代码

int store_bit_field(int original_value,
                    int value_to_store,
                    unsigned starting_bit,unsigned ending_bit)
{
    unsigned int mask=0;
    for(unsigned int i=starting_bit;i<=ending_bit;++i)
        mask|=1<<i;
    original_value&=~mask;
    value_to_store<<=starting_bit;
    value_to_store&=mask;
    return value_to_store|original_value;
}

其中掩码的生成 也可采用如下方法

#define INT_BITS 32
mask = (unsigned)-1;
mask >>= INT_BITS - ( ending_bit - starting_bit + 1 );
mask <<= ending_bit;

Date: 2014-11-05T00:24+0800

Author: kirchhoff

Org version 7.9.3f with Emacs version 24

Validate XHTML 1.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值