取給定正整數的指定bit位開始的指定長度的資料 將整數拆分成bit位表示的形式
阿新 • • 發佈:2019-01-23
下面以“取給定正整數的指定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進行與運算,判斷每個位的情況
方法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位 /*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; }
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;
}