位运算小妙招-求二进制序列中1的个数

简介: 位运算小妙招-求二进制序列中1的个数

题目要求

🥩输入一个正整数N,求二进制序列补码中所含1的个数

解法1

🍲 类似于得到十进制数的每一位

image.png

🥫相同的道理,如果我们想知道二进制序列有多少个1,只需要让正整数N不断%2进行判断,使用计数器,统计1的个数,当N为0时,跳出循环

image.png

🍇代码如下

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

🍤改进: 当我们输入的是负数时,结果会出错,因为整数在内存中以补码形式存储,所以我们可以把参数定义为无符号整数(size_t  即unsigned int) ,这样传参为负数时也不会出错

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

解法2

🥂想办法得到二进制序列中的每一位,这样就要使用到位运算的知识了。

🥨按位与运算& :    0&1 = 0 1&1 = 1    所以我们可以让二进制序列的每一位和1进行与运算,如果对于的二进制序列的位为1,那么结果就是1,反之则是0.


🍷那么我们怎么得到二进制序列中的每一位呢?这里就需要用到右移的知识点了.

右移得到每一位的二进制比特位之后,与1相与进行判断。使用计数器进行计数,如果相与的结果为1,计数器+1

🍮右移:移动的是比特位.


image.png

🍼代码如下

size_t count_bit_one(int n)
{
    int i = 0;
    size_t count = 0;
    for (i = 0; i < 32; i++)
    {
        //n不断右移,对应的二进制位和1相与进行判断,共进行32次
        if (((n >> i) & 1) == 1)
        {
            count++;
        }
    }
    return count;
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    size_t count = count_bit_one(n);
    printf("%d的二进制序列的1的个数为:%u\n", n,count);
  return 0;
}
复制代码

解法3

🍪此处我们要知道n&(n-1)代表什么含义

🥈n&(n-1) :去掉二进制序列中最低位的1  

👢只要知道进行了多少次n&(n-1)运算就知道二进制序列有多少个1


image.png


⚽代码如下

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

总结

🥼x|(x+1)   : 把二进制序列中最低位的0变成1  可以用此方法统计二进制序列中0的个数,每使用一次,就把低位的0变成1,最后为全1序列、只要统计通过几次使用,值变成-1,就知道二进制序列有多少个0

👕当二进制序列全为1时(补码):代表的值为:-1

👔n&(n-1) : 去掉二进制序列中最低位的比特位1 可以用此方法统计二进制序列中1的个数,每使用一次,就把低位的1变成0,最后为全0序列,只要统计通过几次使用,值变成0,就知道二进制序列有多少个1


相关文章
|
自然语言处理 JavaScript
vue element plus Config Provider 全局配置
vue element plus Config Provider 全局配置
828 0
|
人工智能 算法 决策智能
【五子棋实战】第2章 博弈树负值极大alpha-beta剪枝算法(一)
市面上比较常用的五子棋算法是博弈树极大极小值alpha-beta剪枝算法,该算法可以分成四个部分来讲解,它们是环环相扣的:博弈树 - 极大极小值搜索 - 负值极大法 - alpha&beta剪枝 。
1698 0
|
编译器 芯片
字扩展与位扩展
字扩展与位扩展
677 0
|
2月前
|
人工智能 运维 API
阿里云千问大模型完整指南:功能、参数与各类订阅方案详解
阿里云千问系列大模型依托百炼MaaS平台提供标准化调用服务,覆盖文本对话、多模态交互、代码开发、自主智能体等全类业务场景,面向个人开发者、小型团队与中大型企业提供分层模型版本、灵活参数配置体系以及多样化付费订阅模式。2026年平台持续更新模型能力与优惠政策,同步适配OpenClaw、Hermes Agent、Qwen Code等主流AI智能体与编程工具,兼顾轻量化日常使用和企业级复杂长周期任务。本文从模型功能划分、核心参数配置、多类订阅方案、选型建议与故障排查五大板块完整拆解,帮助使用者根据自身场景匹配对应模型、合理控制调用成本、规范完成API接入。
1106 4
|
机器学习/深度学习 算法 安全
随机性、熵与随机数生成器:解析伪随机数生成器(PRNG)和真随机数生成器(TRNG)
随机性在密码学、仿真和机器学习等领域中至关重要,本文探讨了随机性、熵的概念以及伪随机数生成器(PRNG)和真随机数生成器(TRNG)的原理和应用。PRNG通过算法生成看似随机的序列,适用于高效需求;TRNG利用物理过程生成真正随机数,适用于高安全需求。文章还讨论了两者的协同应用及其面临的挑战。
1439 5
随机性、熵与随机数生成器:解析伪随机数生成器(PRNG)和真随机数生成器(TRNG)
|
11月前
|
存储 人工智能 大数据
云栖2025|阿里云开源大数据发布新一代“湖流一体”数智平台及全栈技术升级
阿里云在云栖大会发布“湖流一体”数智平台,推出DLF-3.0全模态湖仓、实时计算Flink版升级及EMR系列新品,融合实时化、多模态、智能化技术,打造AI时代高效开放的数据底座,赋能企业数字化转型。
3134 0
|
机器学习/深度学习 存储 文字识别
Llama 4上线魔搭社区!社区推理、微调实战教程来啦!
近期,Meta推出了Llama 4系列的首批模型: Llama 4 Scout 和 Llama 4 Maverick。
1184 12
|
机器学习/深度学习 人工智能 自然语言处理
云上一键部署通义千问 QwQ-32B 模型,阿里云 PAI 最佳实践
3月6日阿里云发布并开源了全新推理模型通义千问 QwQ-32B,在一系列权威基准测试中,千问QwQ-32B模型表现异常出色,几乎完全超越了OpenAI-o1-mini,性能比肩Deepseek-R1,且部署成本大幅降低。并集成了与智能体 Agent 相关的能力,够在使用工具的同时进行批判性思考,并根据环境反馈调整推理过程。阿里云人工智能平台 PAI-Model Gallery 现已经支持一键部署 QwQ-32B,本实践带您部署体验专属 QwQ-32B模型服务。
|
运维 Kubernetes 网络协议
运维之道:从新手到专家的成长路径
【10月更文挑战第22天】 本文将探讨运维领域内,个人如何从一名初学者成长为行业专家的过程。通过分析学习路线、必备技能、实践经验积累以及持续学习的重要性,旨在为那些渴望在IT运维领域取得成就的人提供指导和启发。
|
网络协议 物联网 虚拟化

热门文章

最新文章