1、题目描述
输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
数据范围:- 2^{31} <= n <= 2^{31}-1−231<=n<=231−1
即范围为:-2147483648<= n <= 2147483647−2147483648<=n<=2147483647
2、算法分析
第一种方法:
知识补充:
①将字符串转换为字符数组char[] ch = str.toCharArray();
②将十进制转换为二进制: String str = Integer.toBinaryString(n);
以上知识补充也就是算法重要的两步骤,在 String str = Integer.toBinaryString(n);方法中已经包含了负数补码等。所以接下来只要遍历字符数组元素中含有1的个数就可以。
第二种方法:
知识补充:
n&(n-1)作用:将整数n的二进制为最低位为1的改为0。也就是对1进行计数。
举例:
n = 10100(二进制),n-1 = 10011,则n&(n-1) = 10000
可以看到将n = 10100最低位的1变为0,即10000
3、代码实现
方法一:
public class Solution {
public int NumberOf1(int n) {
// 将整数转换为字符串
String str = Integer.toBinaryString(n);
// 将字符串转换为字符数组
char[] ch = str.toCharArray();
int count = 0;
// 计算字符数组中含有1的个数
for(int i = 0;i < ch.length;i++){
if(ch[i] == '1'){
count++;
}
}
return count;
}
}
方法二:
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n != 0){
count++;
n &= n-1;
}
return count;
}
}