记录一个算法题(java代码):统计正整数n的二进制写法中有多少个1

package ludims.main;

import java.util.Scanner;

public class myMain {
    public static void main(String[] args) {
        System.out.println("统计正整数n的二进制写法中有多少个1"); //题干        
        Scanner in =new Scanner(System.in); //声明一个Scanner对象,接收键盘输入内容
        System.out.println("请输入一个整数:"); //提示输入数据
        while(in.hasNextLong()) {
            long num = in.nextLong();
            if(num >= 0) {
                System.out.println(num + "二进制写法中有 " + count1num(num) + "个1");  //输出计算结果
                System.out.println("请再输入一个整数:"); //提示输入数据
            }else {
                System.out.println("输入的不是正整数,请重新输入正整数:"); //提示输入了负数
            }
        }
        in.close(); //关闭Scanner
        System.out.println("输入格式不对,程序结束!"); //程序结束提示
    }
    
    /**
     * 统计正整数n的二进制写法中有多少个1
     * @param n
     * @return count
     * 使用算法:如n=9 (二进制写法1001) ,则n-1=8 (二进制写法1000),
     * 1001 & 1000 后结果为1000,即去掉了最右端的1,
     * 1000 再& 0111 结果为0000,如此统计循环的次数即可
     */
    static int count1num( long n) {
        int count;
        for(count = 0 ; n > 0; ++count) {  //每次将最后右端的1转换成0,循环统计1的个数
            n &= (n-1);  //位运算
        }
        return count;
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值