1. 程式人生 > >程式設計實現求一個整數的二進位制中0和1的個數

程式設計實現求一個整數的二進位制中0和1的個數

宣告:假定該數是在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;
}

執行結果:


一點小技巧:

上述的演算法也可以只掌握一種,通過總的平臺為數減去其中的一個就可以求出另外一個的位數,同時也可以用來驗證計算的結果。