二进制数据存储

二进制数据存储

Table of Contents

  • 1 问题
  • 2 解析
  • 3 代码

1 问题

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

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

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

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

原始值 需要存储的值 起始位 结束位 返回值
0x0 0x1 4 4 0x10
0xffff 0x123 4 15 0x123f
0xffff 0x123 9 13 0xc7ff

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

你可能感兴趣的:(二进制,数据,存储,数据存储)