二进制中 1 的个数

优化算法:计算整数二进制表示中1的个数

1、题目描述

输入一个整数,输出该数二进制表示中 1 的个数。其中负数用补码表示。

2、代码

package com.ypj.java;

public class NumberOfOne {

    /**
     * 方法1:整数转字符串
     * @param n
     * @return
     */
    public static long numberOfOne(int n){

        String str = Integer.toBinaryString(n);

        char arr[] = str.toCharArray();

        long count = 0;

        for(int i=0;i<arr.length;i++){
            if(arr[i] == '1'){
                count ++;
            }
        }

        return count;

    }

    /**
     *  方法2:
     * @param n
     * @return
     */

    public static int numberOfOne1(int n){

        int count = 0;

        if(n < 0){
            n = n & 0x7FFFFFFF;
            count ++;
        }


        while(n != 0){

            if(n % 2 == 1){
                count ++;
            }

            n = n / 2;
        }
        return count;
    }

	
    /**
     *  方法3:
     * @param n
     * @return
     */

    public static int numberOfOne2(int n){
        int count = 0;
        if(n < 0){
            n = n & 0x7FFFFFFF;
            count ++;
        }
        while(!(n==0)){
            if((n & 1)==1){
                count ++;
            }
            n = n >> 1;
        }
        return count;
    }

	
    /**
     *  方法4:
     * @param n
     * @return
     */	

    public static int numberOfOne3(int n){
        int count = 0;
        while(n != 0){
            n = n & (n-1);
            count ++;
        }
        return count;
    }





    public static void main(String[] args) {

        long t1 = System.nanoTime();
        System.out.println(numberOfOne(7));
        long t2 = System.nanoTime();
        System.out.println(numberOfOne1(7));
        long t3 = System.nanoTime();
        System.out.println(numberOfOne2(7));
        long t4 = System.nanoTime();
        System.out.println(numberOfOne3(7));
        long t5 = System.nanoTime();
        long t21 = t2 - t1;
        long t32 = t3 - t2;
        long t43 = t4 - t3;
        long t54 = t5 - t4;
        System.out.println("方法1:"+t21+"ns");
        System.out.println("方法2:"+t32+"ns");
        System.out.println("方法3:"+t43+"ns");
        System.out.println("方法4:"+t54+"ns");
    }
}

3、运行结果

在这里插入图片描述
4、结论

由上图的运行结果,可知方法4的算法效率更高。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值