写一个函数返回参数二进制中 1 的个数(c语言三种实现方法)

(本文旨在自己做题时的总结,我会给出不同的解法,后面如果碰到新的题目还会加入其中,等于是我自己的题库。

1.写一个函数返回参数二进制中 1 的个数。

比如: 15 0000 1111 4 个 1

方法一:

cpp 复制代码
#include <stdio.h》

int NumberOf1(int n) 
{
    int i = 0;
    int count = 0;
    for (i = 0; i < 32; i++)
    {
        if (((n >> i)&1) == 1)   //一个二进制序列最低位 按位与1 都可以得出该最低位是0还是1
            count++;             // 然后将二进制序列逐位右移,就可得出二进制中1的个数
    }
    return count;
}

int main()
{
    int n = 0;
    scanf("%d", &n);
   
    int ret = NumberOf1(n);
    printf("%d", ret);
    return 0;
}

方法二:

这里说一个方法,任何一个进制数%它的进制位都可以得到它的最低位,任何一个进制数**/**它的进制位都可以将最低位丢弃。比如:

这样我们每次就可以得到最低位,还可以得到去掉最低位的其他位。

cpp 复制代码
int NumberOf1(int n) 
{
    int count = 0;
    while (n)
    {
        if (n % 2 == 1)
            count++;
        n /= 2;
    }
    return count;
}


int main()
{
    int n = 0;
    scanf("%d", &n);

    int ret = NumberOf1(n);
    printf("%d", ret);
    return 0;
}

但是上述代码要是负数的情况呢? 加一个强转即可

cpp 复制代码
int NumberOf1(unsigned int n) 
{
    int count = 0;
    while (n)
    {
        if (n % 2 == 1)
            count++;
        n /= 2;
    }
    return count;
}


int main()
{
    int n = 0;
    scanf("%d", &n);

    int ret = NumberOf1(n);
    printf("%d", ret);
    return 0;
}

方法三 :

这里要用到一个非常巧妙的方法

cpp 复制代码
int NumberOf1(int n)
{
    int count = 0;
    while (n)
    {
        n = n & (n - 1);
        count++;
    }
    return count;
}

int main()
{
    int n = 0;
    scanf("%d", &n);

    int ret = NumberOf1(n);
    printf("%d", ret);
    return 0;
}

但是上述代码要是负数的情况呢?同方法二一样

相关推荐
熊猫钓鱼>_>7 分钟前
鸿蒙 PC 三方库适配复盘:libfvad 1.0 —— 把 WebRTC VAD 做成能装进采集链路的静态库
服务器·开发语言·华为·harmonyos·openharmony·适配·鸿蒙pc
Ai-_Man19 分钟前
Coze扣子还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·1024程序员节
UIU11427 分钟前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
raindayinrain28 分钟前
c++设计模式
开发语言·c++·设计模式
旖旎夜光30 分钟前
LeetCode 315: 算右侧小于当前元素的个数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
hiahiahia12336 分钟前
Streaming Model Output
开发语言·前端
D e re k ZH44 分钟前
保序回归:从 PAVA 到可并堆的单调约束优化
c++·算法·数据挖掘·回归·kotlin
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:字典树前缀树与单词检索统计
c++·python·算法·bfs·信息学竞赛
熊猫钓鱼>_>1 小时前
鸿蒙PC高分屏与键鼠交互适配:DPI缩放、右键菜单一次讲清
开发语言·笔记·华为·ai编程·harmonyos·鸿蒙·鸿蒙心迹
octopus_c2 小时前
C++ 运算符重载详解 && 日期类的实现
开发语言·c++