上级目录:算法很美
1. 题目
请实现一个函数,输入一个整数,输出该数二进制表示1的个数。例如:9的二进制表示为1001,有2为是1
2. 使用左移(<<)解决:N不动,1左移
- 思路:
整数N有32位,假设当N与上(&)整数A=1第i(0<=i<N)次左移的结果,和A=1这个数第i次左移的结果相同,说明当前二进制对应的位上的数字是1。因此只需要计算A左移过程中结果相同的次数即可
- 代码:
//设置1的个数初始为0
int count = 0;
//思路如下1:整数位有32位,因此只需要让1左移32次,与N的二进制形式中每一位数都进行与运算,每次与1进行与运算的位只有为1才能够保持结果与1左移对应次数的结果相同,其他任何情况都是0
//这样只需要判断相等的次数即可
//思路如下1:整数N有32位,假设当N与上(&)整数A=1第i(0<=i<N)次左移的结果,和A=1这个数第i次左移的结果相同,说明当前二进制对应的位上的数字是1。因此只需要计算A左移过程中结果相同的次数即可
//思路如下1:N不动,1左移
for (int i = 0; i < 32 ;i ++){
if ((N&(1<<i))==(1<<i)){
count++;
}
}
System.out.println("思路1,1<<,数字1存在个数:"+count);
3. 使用无符号右移(>>>)解决:1不动N左移
- 思路:
整数N有32位,假设当N第i次右移的结果等于1的话,说明当前二进制位上的数字是1。因此只需要计算N右移过程中结果相同的次数即可
- 代码:
//思路2如下:整数N有32位,假设当N第i次右移的结果等于1的话,说明当前二进制位上的数字是1。因此只需要计算N右移过程中结果相同的次数即可
//思路2如下:1不动N左移
count = 0;
for (int i = 0; i < 32; i ++){
if (((N>>>i)&1) == 1){
count ++;
}
}
System.out.println("思路2,N>>>,数字1存在个数:"+count);
4. 使用减1方法解决
- 思路:
存在这样一个规律,设整数为N,则要计算N的二进制数中有多少个1,只需要计算当N!=0条件成立,循环执行N=N^(N-1)的次数
- 代码:
//思路3如下:存在这样一个规律,设整数为N,则要计算N的二进制数中有多少个1,只需要计算当N!=0条件成立,执行N=N^(N-1)的次数
//使用当类型,满足条件才执行
count=0;
while (N!=0){
N=(N-1)&N;
count++;
}
System.out.println("思路3,数字1存在个数:"+count);