问题描述
输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
示例
示例1
输入 5
输出 2
解决思路
分析
问题的关键在于十进制转二进制后1的个数
方法
- 普通方法,通过找规律计算
十进制 | 二进制 | 1的个数 | 除数/2 | 商 | 余数 | 商/2 | 商 | 余数 |
---|---|---|---|---|---|---|---|---|
1 | 01 | 1 | 1/2 | 0 | 1 | |||
2 | 10 | 2 | 2/2 | 1 | 0 | |||
3 | 11 | 2 | 3/2 | 1 | 1 | |||
4 | 100 | 1 | 4/2 | 2 | 0 | 2/2 | 1 | 0 |
5 | 101 | 2 | 5/2 | 2 | 1 | 2/2 | 1 | 0 |
6 | 110 | 2 | 6/2 | 3 | 0 | 3/2 | 1 | 1 |
7 | 111 | 3 | 7/2 | 3 | 1 | 3/2 | 1 | 1 |
通过以上计算可以看出规律:1的个数 = a%2(递归)+ a/2(最后一次)
- 通过&运算的特征计算
- &运算,相同为0,不同为1
- n&n-1,得到的结果的二进制 为 n的二进制最右侧的1变为0
- 例如:6的二进制,110&101=100,100&11=0,1的个数为1
代码实现
// 思路1实现,通过递归实现
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
//输入参数
int a = in.nextInt();
System.out.println(count(a));
}
// 通过递归实现
private static int count(int a) {
return a == 0 ? 0 : a % 2 + count(a / 2);
}
}
// 思路2实现,通过&运算实现
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
//输入参数
int a = in.nextInt();
int count = 0;
while (a != 0) {
a &= a - 1;
count++;
}
System.out.println(count);
}
}
小伙伴如果想测试的话,可以直接到牛客网这个链接做测试