利用位与运算简化代码

题目及代码来源:《数据结构习题解析(第三版)》,邓俊辉编著,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. Java 线程池必知的8 大拒绝策略
  2. VSS介绍和备份技巧
  3. 使用pip来安装pyOpenSSL
  4. 优化问题中的两个挑战是?
  5. Anaconda更新源失败
  6. letsencrypt 免费https安装过程linux centos
  7. java 遍历hashmap key_Java5种遍历HashMap数据的写法
  8. 前端笔记-通过jQuery获取input数据及html中name的使用
  9. 检索 COM 类工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件时失败
  10. svn: Commit failed (details follow): svn: Authorization failed
  11. Linux下的python.......安装
  12. 思维导图哪款好用?怎么借助MindManager 做旅游计划
  13. Windows开机启动项/自启动项文件夹位置
  14. Kubernetes基础:Pod中的Pause容器
  15. java常见的网络异常
  16. c语言位运算负数的实例_负数位运算的右移操作-C语言基础
  17. ESP8266-Arduino编程实例-LPS25H压阻式压力传感器驱动
  18. 【Linux】ARM篇一--计算机基础与RAM处理器概论
  19. 我安装Solaris的全过程。
  20. 脉冲神经元的建模与分析

热门文章

  1. C#操作RocketMQ用NewLife.RocketMQ发布消息,消费消息
  2. 关于win10系统(客户机)无法添加网络共享打印机的解决办法(提示信息:操作失败,错误为0X0000011B)
  3. 平安科技汪洋:专业+优雅,聊聊你不知道的程序员艺术
  4. APP开发需要具备的详细的技术方案
  5. mysql innodb myisam_MySQL正确的myisam转innodb的方法
  6. 2017年我国将开始部署和建设IPv6地址项目
  7. 0x01 整理portapack mayhem固件内各种应用名称的由来
  8. Yunxion智能定位胸牌为一线记者提供安全保障
  9. oracle数据库中的注释
  10. 关于大学生恋爱观的调查