当前位置: 首页 > 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 端上架用户隐私协议实现指南
  • 内塔尼亚胡称将控制“整个加沙”,英、法、加威胁对以“制裁”
  • 中疾控专家:新冠感染的临床严重性未发生显著变化
  • 设甜蜜打卡点、还能当婚车,上海定制公交车变身“幸福专列”
  • 马上评|去年维修竣工的鼓楼,今年就“瀑布式落瓦”
  • “集团结婚”:近百年前革新婚俗的尝试
  • 钱进已任外交部新闻司副司长