神奇的位运算——二进制中1的个数

来源:互联网 发布:js常见的关键字直接量 编辑:程序博客网 时间:2024/05/17 23:21

输入一个整数,输出该数二进制表示中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;

    }