程式設計實現求一個整數的二進位制中0和1的個數
阿新 • • 發佈:2019-02-09
宣告:假定該數是在32位平臺的機器上執行,在更高或最低平臺上的原理相同。
核心最優演算法:
求1的個數:num&=(num+1)
求0的個數:num |=(num+1)
問題分析:
因為開始時已宣告該數是在32位機器上,因此該整數的二進位制位總共有32位。
一般思路:採用for迴圈的方式,因為我們已經知道迴圈的次數,所以程式只要跑32次,每次將最低位模2,來判斷最低位是0還是1,從而達到計數的目的。
優化思路:在實際運用中,我們所測的數一般不會很大,數的最前面可能已經出現了全0的情況,因此我們採用上面提供的核心最優演算法來解決這一效率問題。
圖示分析(以25為例):
程式碼實現:
計算二進位制中1的個數:
int CountOneBit(int num)
{
int count = 0;
/*for (int i = 31; i > 0; i++) //一般的實現方式
{
if (num % 2 == 1)
{
count++;
}
else
{
continue;
}
}*/
while (num)
{
count++;
num &= (num - 1); //演算法轉換
}
return count;
}
int main()
{
int value = 25;
int ret = CountOneBit(value);
printf("%d中的二進位制位1的個數有%d\n",value, ret);
system("pause");
return 0;
}
程式執行結果:
計算二進位制中0的個數:
int CountZeroBit(int num)
{
int count = 0;
/*for (int i = 31; i > 0; i++) //一般的實現方式
{
if (num % 2 == 0)
{
count++;
}
else
{
continue;
}
}*/
while (num + 1)
{
count++;
num |= (num + 1); //演算法轉換
}
return count;
}
int main()
{
int value = 25;
int ret = CountZeroBit(value);
printf("%d的二進位制位中0的個數為%d\n",value, ret);
system("pause");
return 0;
}
執行結果:
一點小技巧:
上述的演算法也可以只掌握一種,通過總的平臺為數減去其中的一個就可以求出另外一個的位數,同時也可以用來驗證計算的結果。