1. 程式人生 > >巧用位運算求解二進位制中1的個數

巧用位運算求解二進位制中1的個數

位運算是將數字化為二進位制後,對每一位的0或1進行的運算。一般的運算有與&、或|、異或^和移位等。

如何利用位運算來求解二進位制中1的個數呢?

首先大多數人想到的是先判斷最右邊的一位是不是1,接著將其右移一位,知道數為0停止。將一個數與上1則可以解決這個問題。

程式碼如下:

int NumofOne1(int num)
{
	int count=0;
	while(num)
	{
		if(num&1)
		{
			count++;
		}
		num=num>>1;
	}
	return count;
}

spacer.gif仔細思考就會發現,其實上述程式碼是存在很多問題的。如果我們傳入一個負數給這個函式,這個數將會變成0xFFFFFFFF的死迴圈。為了避免這種問題的發生,可以不進行右移運算。先將輸入的數字與上1,判斷最右邊是否為1,然後將1進行左移一位,判斷倒數第二位……以此類推。

修改程式碼如下:

int NumofOne2(int num)
{
	int count=0;
	unsigned int flag=1;
	while(flag)
	{
		if(num&flag)
		{
			count++;
		}
		flag=flag<<1;
	}
	return count;
}

這個解法雖然避免了死迴圈的問題,但是卻要迴圈32次,可不可以讓其有幾個1就迴圈幾次呢?

可以採用將一個整數減去1,再和原整數做與運算,這樣可以把該整數最右邊一個1變成0,那麼就實現了我們所說的有多少個1就進行多少次迴圈。

程式碼如下:

int NumofOne3(int num)
{
	int count=0;
	while(num)
	{
		++count;
		num=(num-1)&num;
	}
	return count;
}