题目
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,把9表示成二进制是1001,有2位是1。因此,如果输入9,则函数输出2。
分析
我们最容易想到的是从判断整数的二进制表示最后一位是不是1,然后把输入的整数右移一位,判断最后一位是不是1,这样不断的移动,判断,知道整数变为0为止。那如何判断一个整数的二进制表示最后一位是不是1呢?这很简单,我们只要把整数和1做位与运算即可,如果最后一位是1,位与运算后得到1,否则为0。
代码如下:
public static int numberOfOne(int num){
int count = 0;
while(num>0){
if((num & 1) >0) {
count ++;
}
num = num >> 1;
}
return count;
}
上面这种方法存在一个问题,即如果输入的num为负数,则负数右移的时候,高位补1,如果一直做右移运算,会出现死循环。
因此我们要改进这个方法。
为了避免死循环,我们可以不右移num。我们主要是为了判断每一位是不是1,上面的代码中是通过右移num,并每次和1位与的结果来判断。我们改变思路,不右移num,而是左移1。左移不存在符号位受影响的情况。
代码如下:
public static int numberOfOne1(int num){
int count = 0;
int index = 1;
while(index>0){
if((num & index) >0) {
count ++;
}
index = index << 1;
}
return count;
}