Java实现写一个函数返回参数二进制中 1 的个数

这篇博客介绍了三种Java方法来计算一个整数在二进制表示中1的个数。方法一通过模2除法和右移操作;方法二利用按位与运算;方法三使用n&(n-1)技巧。通过示例代码详细解释了每种方法的工作原理。

例如:15 二进制为: 0000 1111
就返回4 个 1
我之前写过一篇用c语言,返回二进制参数1的个数:https://blog.youkuaiyun.com/question_mark/article/details/99637263

方法一:采用模2除2

11在内存中的存储是二进制:0000 0000 0000 0000 0000 0000 0000 1011
11%2=1
再将11/2(也可以看成二进制数右移一位)

11/2=5 其二进制:0000 0000 0000 0000 0000 0000 0000 0101
5%2=1

此时再将 5/2(再进行了一次右移动)
得到2 其二进制: 0000 0000 0000 0000 0000 0000 0000 0010
2%2=0

再将2/2(又进行了一次右移动)
得到1 其二进制:0000 0000 0000 0000 0000 0000 0000 0001
1%2=1

再将1/2 得到0 二进制:0000 0000 0000 0000 0000 0000 0000 0000
二进制中再无1,结束判断

可知11的二进制中1的个数有3个

具体实现代码如下:

public class CountOneBits {

    public static int countOneBits(int num){
        int count=0;
        while(num>0){
            if(num%2==1){
                count++;
            }
            num/=2;
        }
        return count;
    }
    public static void main(String[] args) {
        int i=2223;
        System.out.println(Integer.toBinaryString(i));
        System.out.println(countOneBits(i));
    }
}

方法二:利用按位与进行判断

1的二进制数为 0000 0000 0000 0000 0000 0000 0000 0001
与1进行按位与,如果值为1,计数加1,值为0则不加,然后再将这个数右移一位
具体代码如下:

public class CountOneBits {

    public static int countOneBits(int num){
        int count=0;
        while(num>0){
            if((num & 1) ==1){
                count++;
            }
            num=num>>1;
        }
        return count;
    }
    public static void main(String[] args) {
        int i=666;
        System.out.println(Integer.toBinaryString(i));
        System.out.println(countOneBits(i));
    }
}

方法三:n&(n-1)

以11 为例子
//11 :0000 0000 0000 0000 0000 0000 0000 1011
//10: 0000 0000 0000 0000 0000 0000 0000 1010
11&10:0000 0000 0000 0000 0000 0000 0000 1010 //10
//9: 0000 0000 0000 0000 0000 0000 0000 1001 //9
10&9: 0000 0000 0000 0000 0000 0000 0000 1000 //8
//7 :0000 0000 0000 0000 0000 0000 0000 0111
8&7: 0000 0000 0000 0000 0000 0000 0000 0000
进行三次的n&(n-1),即为11二进制中1的个数
代码如下

public class CountOneBits {

    public static int countOneBits(int num){
        int count=0;
        while(num>0){
            num=num&(num-1);
            count++;
        }
        return count;
    }
    public static void main(String[] args) {
        int i=5689;
        System.out.println(Integer.toBinaryString(i));
        System.out.println(countOneBits(i));
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值