算法很美-位运算-二进制中1的个数

上级目录:算法很美

1. 题目

请实现一个函数,输入一个整数,输出该数二进制表示1的个数。例如:9的二进制表示为1001,有2为是1

2. 使用左移(<<)解决:N不动,1左移

  • 思路:

整数N有32位,假设当N与上(&)整数A=1第i(0<=i<N)次左移的结果,和A=1这个数第i次左移的结果相同,说明当前二进制对应的位上的数字是1。因此只需要计算A左移过程中结果相同的次数即可

  • 代码:
        //设置1的个数初始为0
        int count = 0;
        //思路如下1:整数位有32位,因此只需要让1左移32次,与N的二进制形式中每一位数都进行与运算,每次与1进行与运算的位只有为1才能够保持结果与1左移对应次数的结果相同,其他任何情况都是0
        //这样只需要判断相等的次数即可
        //思路如下1:整数N有32位,假设当N与上(&)整数A=1第i(0<=i<N)次左移的结果,和A=1这个数第i次左移的结果相同,说明当前二进制对应的位上的数字是1。因此只需要计算A左移过程中结果相同的次数即可
        //思路如下1:N不动,1左移
        for (int i = 0; i < 32 ;i ++){
            if ((N&(1<<i))==(1<<i)){
                count++;
            }

        }
        System.out.println("思路1,1<<,数字1存在个数:"+count);

3. 使用无符号右移(>>>)解决:1不动N左移

  • 思路:

整数N有32位,假设当N第i次右移的结果等于1的话,说明当前二进制位上的数字是1。因此只需要计算N右移过程中结果相同的次数即可

  • 代码:
 //思路2如下:整数N有32位,假设当N第i次右移的结果等于1的话,说明当前二进制位上的数字是1。因此只需要计算N右移过程中结果相同的次数即可
        //思路2如下:1不动N左移
        count = 0;
        for (int i = 0; i < 32; i ++){
            if (((N>>>i)&1) == 1){
                count ++;
            }
        }
        System.out.println("思路2,N>>>,数字1存在个数:"+count);

4. 使用减1方法解决

  • 思路:

存在这样一个规律,设整数为N,则要计算N的二进制数中有多少个1,只需要计算当N!=0条件成立,循环执行N=N^(N-1)的次数

  • 代码:
        //思路3如下:存在这样一个规律,设整数为N,则要计算N的二进制数中有多少个1,只需要计算当N!=0条件成立,执行N=N^(N-1)的次数
        //使用当类型,满足条件才执行
        count=0;
        while (N!=0){
            N=(N-1)&N;
            count++;
        }
        System.out.println("思路3,数字1存在个数:"+count);
原创文章 243 获赞 156 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43404791/article/details/105941729