判斷二進位制數中的1有奇數個還是偶數個
阿新 • • 發佈:2018-12-31
判斷(32位)整數的二進位制表示中的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位。。。。
最直接的思路就是求二進位制數中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;
- }
第二次異或,注意是兩位兩位的比較了,所有x是和x>>2做異或運算,比如,若結果第6位為1,那麼代表上一次的結果的第6位和第8位有奇數個1,也就是原數中第6,7,8,9位中有奇數個1。
同樣,到第五次運算結束後,過第0位為1代表0到31位共奇數個1。
整個過程就是不斷的壓縮資訊,先用1位代表從本位開始向左的2位中1的奇偶,然後向左的4位,向左的8位。。。。
二進位制運算是很強大的,平時應多注意思考和總結,恰當的使用二進位制運算可以大大提高程式的效率。