问题: 输入一个整数,求其二进制中1的个数
看到这个问题,我们应该想到数的位运算:
解法一:我们每次将此数&1 ,如果结果等于1,证明此数的最后一位是1,,count++; 然后在将数右移一位,
循环下去,直到此数==0,即可统计出其中1的个数
Test1:
1 private static int getNum1(int i) { 2 int count=0; 3 while (i!=0){ 4 if((i&1)==1){ 5 count++; 6 } 7 i= i>>1; 8 } 9 return count; 10
缺点:这种情况只能适用于正整数,当为负数时,负数循环右移时是用1来填前面空缺的位置,所以永远都不会等于0,陷入死循环
解法二:我们的分析就是:把一个整数减去1。再和原整数做与运算,会把该整数最右边的一个1变成0.那么一个整数的二进制表示中有多少个1,就能够进行多少次运算。
基于这种思路。我们能够写出这种代码:
Test2:
private static int getNum1(int i) { int count=0; while (i!=0){ i=i&(i-1); count++; } return count; }
这样操作,无论数是正还是负都可以完美求出1的个数
解法三:我们调用Integer的方法,将i的二进制转为字符串,再依次遍历其中1的个数,也可以完美解决。
Test3:
private static int getNum1(int i) { int count=0; String str=Integer.toBinaryString(i); for (int j = 0; j <str.length() ; j++) { if(str.charAt(j)=='1'){ count++; } } return count; }