Zou-Wang
小寒
吾生也有涯,而知也无涯
欢迎来到Zou-Wang的博客

查找二进制中1的个数--位运算

1、常见位运算符号

https://blog.whezh.com/bit-hacks/

2、常用位运算技巧

 

 

 3、输入一个数求该数的二进制中1的个数

  法一:将1左移判断

设置一个循环,循环32次(因为int型长度是32位,如果long型就循环64,类推),每次让1左移一位,然后和输入的数进行与运算(和1进行与运算,结果取决于输入数的二进制位,是1结果就是1,0结果就是0),再比较
 //从后往前移动1逐个比对
    public static int doAfter(int num){
        int count=0;
        for (int i=0;i<32;i++){//32表示整形的二进制长度(包括符号位)
            if ((num & (1<<i)) ==(1<<i)){  //num&(1<<i) 是把1逐步右移,和num与,如果num二进制这一位是1的话,结果还是1,是0结果就是0; 再和(1<<i)比较是否等于1
                count++;
            }
        }
        return count;
    }

  法二:输入的数右移判断

//从前往后>>>逐个比对
    public static int doFront(int num){
        int count=0;
        for (int i=0;i<32;i++){  //假设是1010,第一次从0开始不动,1右移变成0101,与运算成立,count+1,第二次,0010,不符合,第三次,0001,符合,count++
            if (((num>>>i)&1)==1){
                count++;
            }
        }
        return count;
    }

  法三、消除二进制中的1,统计消除的次数

(x-1)&x的作用就是消除尾部的1

    01010111    (x)
&   01010110    (x-1)
   ------------
    01010110
 //利用消除1的操作进行统计
    public static int remove1(int num){
        int count=0;
        while (num!=0){  //等于0说明已经没有1可以消除了
            num=(num-1)&num; //后面这个作用是消除尾部的1
            count++;
        }
        return count;
    }
posted @ 2019-12-25 17:15  看远看近  阅读(810)  评论(0编辑  收藏  举报
Live2D
div class="Snow">