您的位置:首页 > 其它

把一个给定的值存储到另一个整数中指定的几位

2012-09-24 14:43 239 查看
编写一个函数,把一个给定的值存储到另一个整数中指定的几位,它的原型如下:

int store_bit_field(int original_value,int value_to_store,unsigned starting_bit,unsigned ending_bit);

假定整数中的位是从右到左进行编号。结束位置不小于起始位置。
为了更清楚的说明,函数应该返回下列值:

原始值     需要存储的值    结束位置     起始位置    返回值

0x0          0x1                      4                   4                  0x10

0xffff        0x123                 15                 4                  0x123f

0xffff        0x123                 13                 9                  0xc7ff

把一个值存储到另一个整数中指定的几个位分为5个步骤(以上表最后一个为例子进行说明)

1:创建一个掩码(mask),它是一个值,其中需要存储的位置相对应的那几个位置为1。此时掩码为001111100000000.

2:用掩码的反码对原值进行and操作,将那几个位置设置为0.原值111111111111111(0xffff),操作后变为110000011111111.

3:将新值左移,是它与那几个需要存储的位对齐。新值0000000100100011(0x123),左移后变为0100011000000000.

4:吧以为后的值与掩码进行and操作,确保除那几个需要存储的为之外的其余位都设置为0.进行这个操作后,值变为000001100000000.

5把结果值与原值进行or操作,结果为11000111111111(0xc7ff),也就是最终的返回值

C代码:

typedef unsigned int u_int;
u_int get_mask(int begin,int end)
{
/*
u_int index = 1u;
int n = 0;

//计算出机器字长n
for(index = 1; index != 0; index <<= 1)
{
n++;
}
printf("机器字长:%d",n);
*/

//要设置的位数
int len = end - begin;

//取得掩码
u_int mask = 2u;
for(int i = 0; i < len; i++)
{
mask |= 1;
mask <<= 1;
}
mask <<= begin - 1;
return mask;
}

int store_bit_field(int original_value,int value_to_store,unsigned starting_bit,unsigned ending_bit)
{
u_int mask = get_mask(starting_bit,ending_bit);
original_value &= ~mask;
value_to_store <<= starting_bit;
value_to_store &= mask;
return value_to_store | original_value;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  存储 c
相关文章推荐