求整数二进制中1的个数-例2
题和解释皆在注释中(´▽`ʃ♡ƪ)
package 二进制中1的个数;
import java.util.Scanner;
/**
* @author 邓雪松 (づ ̄ 3 ̄)づ)9.37
* @create 2021-10-22-21-26
* 题目:
* 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数
* 例:9的二进制表示为1001,有2位是1
*/
public class Demo {
public static void main(String[] args) {
System.out.print("请输入一个整数:");
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
//输出输入的数的二进制形式
System.out.println(Integer.toString(N,2));
int count=0;//计数二进制中1的个数
//之所以是32次循环是因为整形int为4*8
for (int i = 0; i < 32; i++) {
//让N每次与1左移的值相与-->如果与1左移对应位后的值相等-->代表这位(i+1位)为1
if((N&(1<<i))==(1<<i)){
count++;
}
}
System.out.println("第一种方法->输入数二进制形式含有:"+count+"位为1");
//第二种方法开始
count=0;
for (int i = 0; i < 32; i++) {
//思路是让N无符号右移(0-31)位,然后与1与,如果是1--》那么代表这数的第i+1位为1
if(((N>>>i)&1)==1)
count++;
}
System.out.println("第二种方法->输入数二进制形式含有:"+count+"位为1");
//第三种方法比较巧妙 但是也不好想画图吧->公式为输入数x与(x-1)的值->会取出最低为的1
count=0;
while(N!=0){
N=((N-1)&N);//每次更新N的值
count++;
}
System.out.println("第三种方法->输入数二进制形式含有:"+count+"位为1");
}
}
方法三解释图
运行结果图
完~