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

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

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值