当前位置: 首页 > article >正文

算法41:位1的个数

一、需求

编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中
设置位的个数(也被称为汉明重量)。

示例 1:

输入:n = 11
输出:3
解释:输入的二进制串 1011 中,共有 3 个设置位。

示例 2:

输入:n = 128
输出:1
解释:输入的二进制串 10000000 中,共有 1 个设置位。

示例 3:

输入:n = 2147483645
输出:30
解释:输入的二进制串 11111111111111111111111111111101 中,共有 30 个设置位。

提示:

1 <= n <= 2^31 - 1

进阶:

如果多次调用这个函数,你将如何优化你的算法?

二、思路分析图

(一)循环检查二进制位

在这里插入图片描述

三、代码

(一)数据初始化

/**
 * 入口
 * 191、位1的个数
 * 输入:
 * nums = 11(1101)
 * 输出:(1的个数)
 * result1 = 3
 * 解释:
 * 1.循环检查二进制位
 * 2.位运算优化
 * 3.循环检查二进制位调优
 */
@Test
public void suanfa43()
{
    // 初始化
    int num = 11;
    int index = getHammingWeight(num);
    System.out.println("循环检查二进制位 = " + index);
    int index1 = getHammingWeightOne(num);
    System.out.println("位运算优化 = " + index1);
    int index2 = getHammingWeightTow(num);
    System.out.println("循环检查二进制位调优 = " + index2);
}

(二)循环检查二进制位【自己写的方案】

/**
 * 循环检查二进制位
 *
 * @param n
 * @return
 */
private int getHammingWeight(int n)
{
    int index = 0;
    while (n != 0)
    {
        if (n % 2 == 1)
        {
            index++;
        }
        n /= 2;
    }
    return index;
}

(三)位运算优化

/**
 * 位运算优化
 *
 * @param n
 * @return
 */
private int getHammingWeightOne(int n)
{
    int ret = 0;
    while (n != 0) {
        n &= n - 1;
        ret++;
    }
    return ret;
}

(四)循环检查二进制位调优

/**
 * 循环检查二进制位调优
 *
 * @param n
 * @return
 */
private int getHammingWeightTow(int n)
{
    int index = 0;
    while (n != 0)
    {
        index += n % 2;
        n /= 2;
    }
    return index;
}

(五) 结果图

在这里插入图片描述

作者:王子威

四、总结

  • 学习了位1的个数算法
  • 主要采用二进制计算逻辑
  • 调优发现没必要判断,所有的模加起来也是一样的
  • 算法兴趣+1 总:41
  • 加强了对算法的分析能力

http://www.kler.cn/news/304291.html

相关文章:

  • 赎金信--力扣383
  • 『功能项目』战士的伤害型技能【45】
  • ubuntu安装containerd,取代docker
  • Java面试题——第七篇(Java Web)
  • Redis 篇-深入了解基于 Redis 实现消息队列(比较基于 List 实现消息队列、基于 PubSub 发布订阅模型之间的区别)
  • mfc140u.dll丢失有啥方法能够进行修复?分享几种mfc140u.dll丢失的解决办法
  • 从零实现诗词GPT大模型:实现多头自注意力
  • 灌区信息化发展趋势展望
  • 基于MATLAB的图像融合设计
  • 2024年9月中国数据库排行榜:openGauss系多点开花,根社区优势明显
  • Linux进阶命令-sortwc
  • [Web安全 网络安全]-文件上传漏洞
  • 创建者设计模式
  • 使用 React Testing Library 测试自定义 React Hooks
  • 《自然语言处理 Transformer 模型详解》
  • OpenCV GUI常用函数详解
  • uniapp媒体
  • ACE之ACE_Reactor_Notify
  • IHostedLifecycleService是如何管理后台任务的
  • linux-L3_linux 查看进程(node-red)
  • 如何防止ZIP压缩文件被随意打开?
  • union和union all的区别,别再傻傻分不清楚了!
  • 多模态学习
  • 算法练习题20——猴子选大王(模拟)
  • 【鸿蒙】HarmonyOS NEXT星河入门到实战9-组件化开发进阶应用状态管理
  • [SC]Windows VS2022下配置SystemC环境
  • web前端-HTML常用标签(三)
  • 揭秘线程安全:HashMap 的四大实用策略
  • 树莓派智能语音助手实现音乐播放
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​