二进制数据存储
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 解析
- 创建一个掩码(mask),它是一个值,其中需要存储的位置相对应德那几个位设置为1,此 时掩码为0011 1110 0000 0000。
- 用掩码的反码对原值执行AND操作,将那几个位设置为0,原值为1111 1111 1111 1111, 操作后变为1100 0001 1111 1111。
- 将新值左移,使它与那几个需要存储德位对齐。新值0000 0001 0010 0011(0x123),左 移后变为0100 0110 0000 0000。
- 把移位后德值与掩码进行位AND操作,确保除那几个需要存储德位之外德其余位都设置为 0,进行这个操作后,值变为0000 0110 0000 0000。
- 把结果值与原值进行位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;