取给定正整数的指定bit位开始的指定长度的数据 将整数拆分成bit位表示的形式

12 篇文章 0 订阅

下面以“取给定正整数的指定bit位开始的指定长度的数据”为例说明如何将整数拆分成bit位表示的形式。


取给定正整数的指定bit位开始的指定长度的数据。bit位从右向左从0开始计算。
函数原型: unsigned int GetBitsValue(unsigned int input, unsigned int startbit, unsigned int bitlen)
         input      输入的整数
         startbit   需要获取的开始bit
         bitlen     需要获取的bit长度
       Output Param 
         无
        Return Value对应的bit取值

这个问题的主要难点在于如何将整数拆分成bit位表示的形式。有两种方法:

方法1:将整数右移位,同1进行与运算,判断每个位的情况

unsigned int GetBitsValue(unsigned int input, unsigned int startbit, unsigned int bitlen)
{
	if(bitlen > (startbit + 1))  //预防 如果超界,位长比起始的还多
		return 0;
	/*在这里实现功能*/	
	unsigned int out = 0;
	unsigned int bit[64] = {0};	//可以只设定为32位
	/*for(int i = 0;i < 32;++i)  //这种方法没有考虑数字是负数,即最左bit位为1,右移时的情况
	{							// 在本题中这样做也可以,因为 input为unsigned int型,不存在负数
		bit[i] = input & 0x1;
		input >>= 1;
	}*/
	unsigned int flag = 1;
	unsigned int cnt = 0;
	while(flag)
	{
		if(input & flag)
			bit[cnt] = 1;
		else
			bit[cnt] = 0;
		++cnt;
		flag <<= 1;
	}
	for(int i = 0;i < bitlen;++i)
		/*out += bit[startbit - i];*/   //不能简单的相加,因为每两位之间是2倍的关系
		out = bit[startbit - i] + out * 2;

    return out;
}
方法2:不断求余、求商运算

unsigned int GetBitsValue(unsigned int input, unsigned int startbit, unsigned int bitlen)
{
	if(bitlen > (startbit + 1))  //预防 如果超界,位长比起始的还多
		return 0;
	/*在这里实现功能*/	
	unsigned int out = 0;
	unsigned int bit[64] = {0};	//可以只设定为32位
	unsigned int cnt = 0;
	unsigned int num = input;
	while(num)
	{
		bit[cnt] = num % 2;
		num /= 2;
		++cnt;
	}


	for(int i = 0;i < bitlen;++i)
		/*out += bit[startbit - i];*/   //不能简单的相加,因为每两位之间是2倍的关系
		out = bit[startbit - i] + out * 2;

    return out;
}

由于最后计算时只从 startbit位向低位计算,所以只求解出startbit位向下的就可以了

unsigned int GetBitsValue(unsigned int input, unsigned int startbit, unsigned int bitlen)
{
	if(bitlen > (startbit + 1))  //预防 如果超界,位长比起始的还多
		return 0;
	/*在这里实现功能*/	
	unsigned int out = 0;
	unsigned int bit[64] = {0};	//可以只设定为32位
        unsigned int cnt = 0;
	unsigned int num = input;
	while(cnt <= startbit)
	{
		bit[cnt] = num % 2;
		num /= 2;
		++cnt;
	}

	for(int i = 0;i < bitlen;++i)
		/*out += bit[startbit - i];*/   //不能简单的相加,因为每两位之间是2倍的关系
		out = bit[startbit - i] + out * 2;

    return out;
}

也可以使用反复遮罩的方法(省去了最后的for运算了):

unsigned int GetBitsValue(unsigned int input, unsigned int startbit, unsigned int bitlen)
{
//if(startbit>31||bitlen>32||(bitlen>(startbit+1)))
        //return 1;

    unsigned int mask=0;
    unsigned int endbit=startbit+1-bitlen;
    mask=(~mask)<<(bitlen);
    
    input=input>>endbit;
    input=input&(~mask);

    return input;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值