1.问题描述:
请实现一个函数,输入一个整数,输出该数字二进制表示中1的个数
2.思路分析
①可以通过位运算将一个数字进行二进制位数的运算,第一种方法是将1向左移n位,而且从低位开始往右移动
比如:1011011
从最右边的位开始移动,1移动的位数为从右边算起,移动n位,n从0开始,左移n位后的数字与原来的数字1011011进行与运算,保留了该位上的1,消除掉了其他的1,判断和1做移动n位的数字是否相同,假如相同那么该位数字上是1,计数变量加1,通过在循环中就可以实现
下面是代码实现:
import java.util.Scanner;
public class 一的个数 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int count = 0;
//可以用来查看输入的数字转换成的二进制字符串
System.out.println(Integer.toString(n, 2));
for(int i = 0;i<32;i++){
if((n&(1<<i))==(1<<i)){
count++;
}
}
System.out.println(count);
}
}
② 第二种方法是数字往右移动至最低位与1进行与运算
下面是代码实现:
int count = 0;
for(int i = 0;i<32;i++){
if(((n>>>i)&1)==1){
count++;
}
}
System.out.println(count);
③ 第三种方法是通过每次循环中减去一个1与原来的数进行与运算,直至该数字变成0
因为我们知道假如某一位减去一个1之后进行与运算,那么一定会消除掉该位上的1
下面是代码实现:
int count = 0;
while(n!=0){
n = (n - 1)&n;
count++;
}
System.out.println(count);
改方法也是消除1的方法