最直接的思路就是求二進制數中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位。。。。
二進制運算是很強大的,平時應多注意思考和總結,恰當的使用二進制運算可以大大提高程序的效率。