Java数据结构之位运算——求某整数的二进制中1的个数

输入一个整数,求该整数的二进制表示中1的个数。

在这里插入图片描述

public class CountOneTimes {

    public int ExtractRightOne(int a){

        int a_r1 = a & ((~a) +1); //提取最右侧的1

        return a_r1;
    }

    public int countonetimes(int a){

        TenToTwo(a);

        int count = 0;

        while(a != 0){

            int a_r1 = ExtractRightOne(a);
            count ++;

            a = a ^ a_r1;
        }

        return count;
    }

    public void TenToTwo(int a){

        // 十进制转化为二进制
        int quotients = a;
        int remainders = 1;

        String str = "";

        //商和余数: quotients and remainders
        while(quotients != 0){

            remainders = quotients % 2;
            quotients = quotients / 2;

            str = remainders + str;
        }

        System.out.println(a + "的二进制为:" + str);
    }

    public static void main(String[] args) {
        
        int a = 19;
        CountOneTimes countOneTimes = new CountOneTimes();

        int count = countOneTimes.countonetimes(a);

        System.out.println(a + "的二进制中1的个数为:" + count);

    }
}

输出

19的二进制为:10011
19的二进制中1的个数为:3
### C语言实现计算整数二进制表示中1个数 #### 取余法 通过不断对2取余并累加余数可以统计二进制表示中有多少个1。每次模操作后,将原数值右移一位继续上述过程直到该数值变为零。 ```c int countBitsRemainder(int num){ int cnt = 0; while (num != 0) { cnt += num % 2; // 如果当前最低位是1,则计数器增加 num /= 2; // 将数字向右移动一位相当于去掉最后一位 } return cnt; } ``` 此方法简单直观但是效率较低因为涉及到大量的除法运算[^1]。 #### 移位法 利用按位与(&)以及无符号右移(>>)的操作来逐位检测每一位是否为1,并且每轮循环都将目标值减半直至其归零为止。 ```c unsigned int countSetBitsShift(unsigned int n){ unsigned int count = 0; while (n) { count += n & 1u; // 判断最右边的一位是不是1 n >>= 1; // 把这个数往右移去下一次判断下一个低位 } return count; } ``` 这种方法相较于前一种性能更优因为它只用了基本逻辑指令而没有复杂的算术运算。 #### 高级计算法——Brian Kernighan’s Algorithm 对于非负整数x来说,`x&(x−1)`会使得x中最右侧的那个'1'变成'0',因此可以通过重复执行这一操作直到整个数变为全0从而得知其中含有几个1. ```c int bitCountBKAlg(unsigned long x){ int bits = 0; while(x!=0){ ++bits; x &= (x - 1); } return bits; } ``` 这种技巧不仅简洁而且高效特别适合处理大范围内的正整数.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值