1. 程式人生 > >取給定正整數的指定bit位開始的指定長度的資料 將整數拆分成bit位表示的形式

取給定正整數的指定bit位開始的指定長度的資料 將整數拆分成bit位表示的形式

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