判斷二進制數中的1有奇數個還是偶數個

判斷(32位)整數的二進制表示中的1有奇數個還是偶數個
最直接的思路就是求二進制數中1的個數,然後確定是偶數還是奇數。
代碼如下:
// true爲x二進制表示中含有奇數個1,false爲偶數個1
bool OddOnes(int x) 
{
	int cnt = 0;
	while(x)
	{
		cnt++;
		x &= x-1;
	}
	return cnt & 1;
}

上述代碼的就是先求x二進制中1的個數,方法就是通過x &= x-1去掉最右端的1,直到x變爲0,去掉了幾次1就是原x二進制中含有多少個1;然後確定個數爲奇數還是偶數。

下面是利用強大的位運算來得到結果:

bool OddOnes(int x)
{
	x = x ^ (x >> 1);
	x = x ^ (x >> 2);
	x = x ^ (x >> 4);
	x = x ^ (x >> 8);
	x = x ^ (x >> 16);
	return x & 1;
}
第一次異或的結果,第i個位置上是1代表原數中第i位和第i+1位有一個爲1,也就是奇數個1。也就是說,某個位爲1,代表從它開始向左連續兩位中1的個數是奇數(異或的本質)。
第二次異或,注意是兩位兩位的比較了,所有x是和x>>2做異或運算,比如,若結果第6位爲1,那麼代表上一次的結果的第6位和第8位有奇數個1,也就是原數中第6,7,8,9位中有奇數個1。
同樣,到第五次運算結束後,過第0位爲1代表0到31位共奇數個1。
整個過程就是不斷的壓縮信息,先用1位代表從本位開始向左的2位中1的奇偶,然後向左的4位,向左的8位。。。。

二進制運算是很強大的,平時應多注意思考和總結,恰當的使用二進制運算可以大大提高程序的效率。


參考資料:http://www.matrix67.com/blog/archives/264

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章