查找二进制中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)# //后面这个作用是消除尾部的1 count++; } return count; }