求整数二进制中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");

    }
}

方法三解释图

运行结果图

完~

posted @ 2021-10-22 21:58  ╰(‵□′)╯  阅读(34)  评论(0编辑  收藏  举报