二进制数据存储
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;
2万+

被折叠的 条评论
为什么被折叠?



