面试题 10:二进制中 1 的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如把 9 表示成二进制是 1001;有 2 位是 1,因此如果输入 9,函数输出 2.
思路
这个题本来我的思路是类比十进制的规则,设置一个计数变量count,初始值为0。然后用给的整数数和2进行取余操作,结果只有两种可能:0或1,如果结果是1,计数变量+1;如果是0,不操作。然后num /= 2(二进制右移一位,和十进制中数/=10后所有数右移一位的操作类似)。不断循环,直到这个数的值小于1,返回计数变量的值就能求出来。但是看了网上的一个利用二进制数‘&’操作性质的方法,也能得出正确答案,而且经过试验,速度比上面的思路运行更快,所以我们选择这种方法。不多说,看代码:
代码
package swordOffer;
/**
* 剑指offer第10题
* 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如
* 把 9 表示成二进制是 1001;有 2 位是 1,因此如果输入 9,函数输出 2.
*
* @author someone
*
*/
public class Ex10NumOf1InBinary2 {
public static void main(String args[]) {
Ex10NumOf1InBinary2 test=new Ex10NumOf1InBinary2();
System.out.println(test.numberOf1(2147483647));
}
public int numberOf1(long n) {
int count=0;
while(n!=0) {
count++;
n=(n-1) & n;
}
return count;
}
}
代码十分简洁,而且效率很高。
下面是第一个思路的代码,相比简洁度和效率都差很多。
package swordOffer;
/**
* 剑指offer第10题
* 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如
* 把 9 表示成二进制是 1001;有 2 位是 1,因此如果输入 9,函数输出 2.
*
* @author Stephen Huge
*
*/
public class Ex10NumOf1InBinary {
public static void main(String[] args) {
Ex10NumOf1InBinary nob = new Ex10NumOf1InBinary();
int ans = nob.numOf1InBinary(2147483647);
System.out.println(ans);
}
public int numOf1InBinary(long num) {
if(num < 0 || num > Long.MAX_VALUE) {
return -1;
}
int count = 0;
if(num % 2 == 0) {
count++;
}
while(num >= 1) {
if(num % 2 != 0) {
count++;
}
num /= 2;
}
return count;
}
}