C语言三种方法实现统计整数在内存中二进制表示的1的个数

本文介绍了三种用C语言实现的计算整数二进制中1的个数的方法:循环模除、按位操作遍历和BrianKernighan算法。后者的效率最高,适用于性能要求高的场景。
摘要由CSDN通过智能技术生成

在计算机科学和数字逻辑领域,计算一个整数在其二进制表示中“1”的个数是一项基础且实用的任务。本文将通过C语言编写并解析三种不同的算法来解决这个问题

方法一:循环模除以2

int one(unsigned int a) {
    int count = 0;
    while (a) {
        if (a % 2 == 1) count++;
        a = a / 2;
    }
    return count;
}

此方法基于逐位分析原理,通过不断地将整数a除以2(即右移一位),并检查余数是否为1,如果是,则计数器count加1。这种方法直观易懂,但效率相对较低,尤其当输入数值较大时,需要进行多次除法和取模运算。

方法二:按位操作与循环遍历

int two(unsigned int a) {
    int count = 0;
    for (int i = 0; i < 32; i++) { // 假设是32位整数
        if ((a >> i) & 1)
            count++;
    }
    return count;
}

这种方法利用了按位右移和按位与的操作。首先,我们对整数a进行从0到31(对于32位整数)的循环遍历,每次循环都将a右移i位,然后与1进行按位与运算,若结果为1,则说明原二进制串的第i+1位为1,因此计数器count加1。这种方法效率较高,因为它仅依赖于位操作,不涉及乘除运算。

方法三:位操作优化算法(Brian Kernighan 算法)

int tree(unsigned int a) {
    int count = 0;
    while (a) {
        a = a & (a - 1);
        count++;
    }
    return count;
}

该方法被称为 Brian Kernighan 算法,其巧妙之处在于每次循环都将aa-1进行按位与操作。由于任何非零整数减1后,其最低位的1会变为0,而低位的所有0都会变为1,这样就消除了原整数二进制表示中的最右边的一个1。因此,每执行一次这样的操作,就代表找到了一个1,所以计数器count增加1。此方法不仅高效,而且代码简洁,时间复杂度仅为O(k),其中k为二进制中1的个数。

总结: 以上三种方法均可以正确计算出整数在内存中二进制表示的1的个数,但在性能上有所差异。通常情况下,Brian Kernighan 算法因其优秀的效率表现而被广泛应用。在实际编程实践中,根据需求和场景选择合适的算法至关重要

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

普通young man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值