题目:请实现一个函数, 输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001 ,有2位是1。因此如果输入9,则该函数输出2。
解题思路:
最简单的方式,将数字与1相与判断是不是1,然后将数字每次右移一位然后再次与1相与。
注意:正整数二进制表示最高位是0,负整数二进制表示最高位是1。如果是负数的话,一直右移那么与1相与一直是1。怎么办呢?在Java中int是32位,我们只需要右移32次就可以了。
/**
* @param n
* @return 数字二进制表示中1的个数
*/
public static int numberOfOne(int n) {
int result = 0;
for (int i = 0; i < 32; i++) {
result += (n & 1);
/**
* 这里用带符号右移和无符号右移都可以,因为循环移动32次就结束了,不会出现死循环的问题。
*/
n >>= 1;
}
return result;
}
测试用例
/**
* -5在计算机中用补码表示是 1111 1111 1111 1111 1111 1111 1111 1011
*/
System.out.println(numberOfOne(-5));
System.out.println(numberOfOne(5));
输出结果
31
2
参考链接:
网友评论