1. 程式人生 > >神奇的位運算——二進位制中1的個數

神奇的位運算——二進位制中1的個數

輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。

方法1:依次右移,使最右側的1依次消失。但需要注意負數右移後會在高位補1,需要將負數轉換為無符號數。

     int NumberOf1(int n)

{

        int cnt = 0;

              unsigned ui = (unsigned)n;         //轉換為無符號數

        while (ui!=0)

        {

            int a = ui & 1;        //與1做位與運算

            if (a == 1)         //最後一位為1

                cnt++;

            ui = ui >> 1;         //右移

        }

        return cnt;

     }

方法2:與n-1相與,同樣可以使最右側的1消失。n-1可以從最右側的一個1開始,讓所有位取反。n&(n-1)後可以讓最右側的1消失。

    int NumberOf1(int n)

    {

        int cnt = 0;

        while (n!=0)

        {

            n = n&(n - 1);             

            cnt++;

        }

        return cnt;

    }