剑指Offer10-二进制中1的个数
题目:
/** * 请实现一个函数,输入一个整数, * 输出该二进制表示中1的个数。 * 例如把9表示成二进制是1001, 有2位是1。 * 因此如果输入9,该函数输出2。 */
解题思路:常规的解法可以去遍历整数对应二进制的每一位,比如:数字9的二进制1001,依次将每一位的数字与1进行 与 运算,若结果为1则表明对应的位数为1;
然后去累积计算1的总体个数。
代码如下:
public class No10 { public static void main(String[] args) { System.out.println(getNum(9)); } public static int getNum(int num) { int count = 0; //累加器:保存二进制中的个数 int flag = 1; //变量,每次循环左移一位 while(flag!=0) { //与运算不等于0说明出现了当前二进制位为1的情况 if((num & flag) != 0) count++; flag = flag << 1; } return count; } }
但是因为int在内存中站32位,故这种方法为循环32次;
有没有一种方法是二进制中有多少个1就循环几次;
答案是有的:首先要知道一个知识点:把一个整数减去1,然后把减去一的结果与该整数做运算,就会把最右边的1变成0,由此可以统计二进制中1的个数
代码如下:
public class No10 { public static void main(String[] args) { System.out.println(getNum(9)); } public static int getNum(int num) { int count = 0; while(num != 0) { num = (num-1) & num; count++; } return count; } }