利用位与运算简化代码

题目及代码来源:《数据结构习题解析(第三版)》,邓俊辉编著,ISBN: 978-7-302-33065-3

题目要求:改进教材中的countOnes()算法,使得时间复杂度降至O(countOnes(n)),线性正比于数位1的实际数目

/*教材算法*/int countOnes(unsigned int n) { //统计整数二进制展开中数位1的总数:O(logn)int ones = 0;               //计数器复位while (0 < n) {             //在n缩减至0之前,反复地ones += (1 & n);        //检查最低位,若为1则计数n >>= 1;                //右移一位}return ones;        //返回计数
}       //等效于glibc的内置函数int_builtin_popcount(unsigned int n)

改进代码如下:

int a_countOnes(unsigned int n) {   //统计整数二进制展开中数位1的总数:O(logn)int ones = 0;           //计数器复位while (0 < n) {         //在n缩减至0之前,反复地++ones;         //计数,至少有一位为1n &= n - 1;     //清除当前最靠右的1}return ones;        //返回计数
}
//  设n最右位的1对应于2^k,于是n的k位以后是 1 0 0...0
//  n-1位以后是 0 0 0...0,则与运算之后清除最靠右的1

原代码中,为了统计二进制数中1的个数,对每一位进行判断,若为1,计数器加一,然后右移一位,判断下一位情况。

代码改进后,分析如下:

  1. 对于任意整数n(n != 0),总有至少一位为1,假设最右位(最低位)的1对应2^k,那么这个数最低位,其二进制为 … 1 0 0 0 … 0;
  2. 对这个最低位的1进行统计,即计数器加一;
  3. 之后将数字n减一,此时其最低位二进制为… 0 1 1 1 … 1;
  4. 将n与n-1进行位与(&)运算,最低位二进制均为0;
  5. 再次找其最低位的1,重复1-4步。

代码改进后,每统计一个1,需要进行的步骤只有计数器加一(O(1)),位与运算(O(1));while循环执行次数与1的个数线性相关,满足题目要求。

利用位与运算简化代码相关推荐

  1. python random seed,python - 字符串重排:固定seed()下利用random.shuffle()简化代码

    目录: 目的:理解random.seed(),通过代码探究并验证其功能. 背景:random()是伪随机,实际上由确定公式根据初始值seed计算得出. 当seed固定时,对特定数据的处理会产生相同的结 ...

  2. 《机器学习实战》之十三——利用PCA来简化数据

    PCA目录 一.前言 二.降维技术 三.PCA 1.PCA的数学原理 (1)向量内积与投影 (2)基 (3)基变换 (4)方差与协方差 2.PCA算法步骤 3.在numpy中实现PCA (1)零均值化 ...

  3. php 位运算与权限,PHP巧妙利用位运算实现网站权限管理的方法

    首先我们先定义4个常量来设定四种权限: ===================================== define(ADD,1);//增加数据库记录的权限 define(UPD,2);/ ...

  4. 利用位运算和指针实现的交换两个数的程序

    位运算是C语言的一大特色,利用异或运算可以实现交换两个数,原理是一个整数与另外一个数进行两次异或运算仍然是其本身,基本原理用式子表达如下: (1) A ^ A = 0; (2) A = A ^B; ( ...

  5. 利用位运算解决 N 皇后问题

    题目: LeetCode 51. N-Queens 分析: N 皇后问题是考查递归回溯的经典问题,深度优先搜索的难点在于如何剪枝,在这个问题里面的剪枝,我们需要利用额外的空间去记录当前行的有效空位,只 ...

  6. python代码该怎么简化_Python开发简化代码的六大技巧

    Python开发代码简化除了采用规范化的编程规则之外,代码编写的逻辑性和对内置规则的掌握也对其有一定的影响,以下是Python3支持的用法,合理的利用可以极大的简化代码的书写复杂度. 1. 列表推导式 ...

  7. 机器学习实战(十一)利用PCA来简化数据

    第十三章 利用PCA来简化数据 13.1 降维技术 13.1.1 主成分分析(PrincipalComponentAnalysis,PCA) 13.1.2 因子分析(Factor Analysis) ...

  8. 1 数列分块入门_线性代数入门——利用分块矩阵简化矩阵乘法运算

    系列简介:这个系列文章讲解线性代数的基础内容,注重学习方法的培养.线性代数课程的一个重要特点(也是难点)是概念众多,而且各概念间有着千丝万缕的联系,对于初学者不易理解的问题我们会不惜笔墨加以解释.在内 ...

  9. java乘以2的位计算符号_java编程之:按位与运算,等运算规则

    按位与运算符(&) 参加运算的两个数据,按二进制位进行"与"运算. 运算规则:0&0=0;   0&1=0;    1&0=0;     1& ...

最新文章

  1. 我靠这份无人机完全指南吹了一整年牛!
  2. JSON API免费接口
  3. c#中WebBrowser控件的使用方法
  4. cron计划任务书写格式
  5. 智能合约重构社会契约 (3)智能合约的自动触发
  6. 用什么技术实现前台页面设计_装饰+装配式,用什么样的方式去实现室内的装配工程施工技术?...
  7. pixhawk 整体架构的认识
  8. 记录idea maven项目打包部署web项目mapper扫描失败
  9. 基于visual Studio2013解决面试题之0203栈实现
  10. C++中图的简单表示法
  11. 可对Python运行原理进行可视化分析的工具
  12. 计算机基础知识教程函数,EXCEL函数教程_电脑基础知识_IT计算机_专业资料.ppt
  13. 王凯1987计算机系,王凯-专家人物-中国水网
  14. 腾讯 AI Lab招聘算法实习生
  15. 技术团队培养_如何在团队中培养伟大的文化
  16. 学术篇 | 面向分类的脑电接口Fuzzy-Rough特征选择
  17. 搭建xamppWeb服务器和TestLink、Mantis环境
  18. 【windows密码查看】在windows系统中保存的windows凭据如何方便地查看?network_password_recovery
  19. mysql 中间件 atlas_MySQL中间件-Atlas
  20. terminal的常用快捷键

热门文章

  1. 读《把时间当作朋友》
  2. 下雨天睡不够 去湿气功略拿走不谢
  3. Hive鲜为人知的宝石-Hooks
  4. Linux中的useradd命令,技术|Linux useradd 命令介绍
  5. MATLAB | 可视化 | 罗密欧与朱丽叶的数据统计
  6. 面试官:看你项目中用到了Hystrix,具体有什么用?
  7. 分布式缓存Redis Cluster在华泰证券的探索与实践
  8. TYVJ 1391 走廊泼水节
  9. 业余学Python是如何挣钱的?用Python赚钱的5个方法,教你业余时间赚外快!
  10. 计算机管理任务计划程序全部禁用,Win10系统设置任务计划程序出现“任务计划程序不可用”如何解决...