方法1:根据除2取余的方法判断1的个数
原理:一个数除以2相当于右移一位 如果除的过程中有与 表示当前位置有一个1
以10 100 010为例:
第一次除以2 商是1 010 001 余数是0 第二次除以2 商是 101 000 余数是1
代码实现:
public static int countByDivide(int num) { int count = 0; while (num != 0) { if (num % 2 == 1) { count++; } num = num / 2; } return count; }方法二:使用位运算
当一个数进行无符号右移时 会丢弃最后一位 所以只要在右移过程中判断最后一位是否是1 来统计1的个数 要判断最后一位是否是1 只需要和0000 0001进行与运算即可
代码实现
public static int countByMove(int num) { int count = 0; while (num != 0) { count += num & 0x01; num = num >> 1; } return count; }方法三:优化算法复杂度 让算法复杂度只和1的个数有关
public static int countByOne(int num) { int count = 0; while (num != 0) { num &= (num - 1); count++; } return count; }方法四:一般的与运算
public int NumberOf1(int n) { int count = 0; for (int t = 31; t >= 0; t--) { if ((n & 1) == 1) { count++; } n = n >> 1; } return count; }ps: 如果是负数 只有最好两种方法符合
