下面以“取给定正整数的指定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;
}