判斷位元中的1有奇數個還是偶數個

來源:互聯網
上載者:User

判斷(32位)整數的二進位表示中的1有奇數個還是偶數個
最直接的思路就是求位元中1的個數,然後確定是偶數還是奇數。
代碼如下:

// true為x二進位表示中含有奇數個1,false為偶數個1bool 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.