1. 程式人生 > >判斷二進位制數中的1有奇數個還是偶數個

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

判斷(32位)整數的二進位制表示中的1有奇數個還是偶數個
最直接的思路就是求二進位制數中1的個數,然後確定是偶數還是奇數。
程式碼如下:
  1. // true為x二進位制表示中含有奇數個1,false為偶數個1
  2. bool OddOnes(int x)   
  3. {  
  4.     int cnt = 0;  
  5.     while(x)  
  6.     {  
  7.         cnt++;  
  8.         x &= x-1;  
  9.     }  
  10.     return cnt & 1;  
  11. }  

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

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

  1. bool OddOnes(int x)  
  2. {  
  3.     x = x ^ (x >> 1);  
  4.     x = x ^ (x >> 2);  
  5.     x = x ^ (x >> 4);  
  6.     x = x ^ (x >> 8);  
  7.     x = x ^ (x >> 16);  
  8.     return x & 1;  
  9. }  
第一次異或的結果,第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位。。。。

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