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

Brian Kernighan算法

最近看到一个题,就是算一个int里面有多少个1。这个还是挺常用的,也不难,就是判断最后一位是不是1,然后移位,很快就能给答案。

    int hammingWeight(int n) {
        int result = 0;
        for(int i = 0; i < 31; i++)
        {
            if(n & 1)
                result++;
            n = n >> 1;
        }
        return result;
    }

但是提交上去看到答案也不是很理想。

主要是内存用的不是很好。查一下这个,是有个Brian Kernighan算法,算法大概是这样的:

int hammingWeight(int n) {        
    while (n) {
            n &= (n - 1);
            ++count;
        }
}

其中关键的就是这句n &= (n - 1);

也就是n = n & (n - 1);

仔细看看这个什么意思呢,关于位操作,之前其实写过一篇。C语言位操作详解:基础原理与实际应用示例-CSDN博客

 关于&,是这样的:

只有两个位都是1时,结果位才是1。
可以用来清除某一段位数据

以6为例子:

二进制是110,那么-1就是101,再&之后就是100(4)。

之后-1就是011,再&之后就是000。跳出循环。

本质就是跳过了0,每次只处理1。

再白话一点就是每次从后清掉一个1,直到清完。

相比以前要硬循环31次,确实巧妙了一些。。。

其实刚刚做的时候,就在想能不能减少循环的次数,其实如果多想几天,也许这种解法也能想到。到时候就也能青史留名啦。。。

相关文章:

  • 【模拟算法】
  • requests库的request和response对象的属性和方法
  • 【PTA题目解答】7-4 数气球 (20分)
  • 清明祭祖(原创)
  • C++Primer学习(7.1 定义抽象数据类型)
  • 助力字体管理,规避设计卡顿的得力工具
  • 详解SQL数据定义功能
  • C++【类和对象】(结束篇)
  • 游戏引擎学习第160天
  • GHCTF web方向题解
  • Next.js项目MindAI教程 - 第七章:社区功能实现
  • 73.HarmonyOS NEXT PicturePreviewImage组件深度剖析:高级功能扩展与性能优化策略(三)
  • 多条件下的免杀webshell
  • 虚拟化数据恢复—重装系统服务器崩了的数据恢复过程
  • Spring Boot对接twilio发送邮件信息
  • 我的博客素材
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(45)血海轮回阵 - Floyd-Warshall 多源最短路径
  • 02-Canvas-fabric.ActiveSelection
  • Rabit
  • Uniapp 开发 App 端上架用户隐私协议实现指南
  • 【社论】优化限购限行,激发汽车消费潜能
  • 当AI开始深度思考,人类如何守住自己的慢思考能力?
  • 中方会否公布铁线礁的领海基线?外交部:中方执法活动旨在反制菲方侵权挑衅
  • 葛兰西的三位一体:重提并复兴欧洲共产主义的平民圣人
  • 泽连斯基公布与特朗普会晤细节,强调实现全面、无条件停火
  • 广汽集团一季度净亏损7.3亿元,同比转亏,总销量下滑9%