利用位与运算简化代码
利用位与运算简化代码
题目及代码来源:《数据结构习题解析(第三版)》,邓俊辉编著,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,计数器加一,然后右移一位,判断下一位情况。
代码改进后,分析如下:
- 对于任意整数n(n != 0),总有至少一位为1,假设最右位(最低位)的1对应2^k,那么这个数最低位,其二进制为 … 1 0 0 0 … 0;
- 对这个最低位的1进行统计,即计数器加一;
- 之后将数字n减一,此时其最低位二进制为… 0 1 1 1 … 1;
- 将n与n-1进行位与(&)运算,最低位二进制均为0;
- 再次找其最低位的1,重复1-4步。
代码改进后,每统计一个1,需要进行的步骤只有计数器加一(O(1)),位与运算(O(1));while循环执行次数与1的个数线性相关,满足题目要求。
利用位与运算简化代码相关推荐
- python random seed,python - 字符串重排:固定seed()下利用random.shuffle()简化代码
目录: 目的:理解random.seed(),通过代码探究并验证其功能. 背景:random()是伪随机,实际上由确定公式根据初始值seed计算得出. 当seed固定时,对特定数据的处理会产生相同的结 ...
- 《机器学习实战》之十三——利用PCA来简化数据
PCA目录 一.前言 二.降维技术 三.PCA 1.PCA的数学原理 (1)向量内积与投影 (2)基 (3)基变换 (4)方差与协方差 2.PCA算法步骤 3.在numpy中实现PCA (1)零均值化 ...
- php 位运算与权限,PHP巧妙利用位运算实现网站权限管理的方法
首先我们先定义4个常量来设定四种权限: ===================================== define(ADD,1);//增加数据库记录的权限 define(UPD,2);/ ...
- 利用位运算和指针实现的交换两个数的程序
位运算是C语言的一大特色,利用异或运算可以实现交换两个数,原理是一个整数与另外一个数进行两次异或运算仍然是其本身,基本原理用式子表达如下: (1) A ^ A = 0; (2) A = A ^B; ( ...
- 利用位运算解决 N 皇后问题
题目: LeetCode 51. N-Queens 分析: N 皇后问题是考查递归回溯的经典问题,深度优先搜索的难点在于如何剪枝,在这个问题里面的剪枝,我们需要利用额外的空间去记录当前行的有效空位,只 ...
- python代码该怎么简化_Python开发简化代码的六大技巧
Python开发代码简化除了采用规范化的编程规则之外,代码编写的逻辑性和对内置规则的掌握也对其有一定的影响,以下是Python3支持的用法,合理的利用可以极大的简化代码的书写复杂度. 1. 列表推导式 ...
- 机器学习实战(十一)利用PCA来简化数据
第十三章 利用PCA来简化数据 13.1 降维技术 13.1.1 主成分分析(PrincipalComponentAnalysis,PCA) 13.1.2 因子分析(Factor Analysis) ...
- 1 数列分块入门_线性代数入门——利用分块矩阵简化矩阵乘法运算
系列简介:这个系列文章讲解线性代数的基础内容,注重学习方法的培养.线性代数课程的一个重要特点(也是难点)是概念众多,而且各概念间有着千丝万缕的联系,对于初学者不易理解的问题我们会不惜笔墨加以解释.在内 ...
- java乘以2的位计算符号_java编程之:按位与运算,等运算规则
按位与运算符(&) 参加运算的两个数据,按二进制位进行"与"运算. 运算规则:0&0=0; 0&1=0; 1&0=0; 1& ...
最新文章
- 我靠这份无人机完全指南吹了一整年牛!
- JSON API免费接口
- c#中WebBrowser控件的使用方法
- cron计划任务书写格式
- 智能合约重构社会契约 (3)智能合约的自动触发
- 用什么技术实现前台页面设计_装饰+装配式,用什么样的方式去实现室内的装配工程施工技术?...
- pixhawk 整体架构的认识
- 记录idea maven项目打包部署web项目mapper扫描失败
- 基于visual Studio2013解决面试题之0203栈实现
- C++中图的简单表示法
- 可对Python运行原理进行可视化分析的工具
- 计算机基础知识教程函数,EXCEL函数教程_电脑基础知识_IT计算机_专业资料.ppt
- 王凯1987计算机系,王凯-专家人物-中国水网
- 腾讯 AI Lab招聘算法实习生
- 技术团队培养_如何在团队中培养伟大的文化
- 学术篇 | 面向分类的脑电接口Fuzzy-Rough特征选择
- 搭建xamppWeb服务器和TestLink、Mantis环境
- 【windows密码查看】在windows系统中保存的windows凭据如何方便地查看?network_password_recovery
- mysql 中间件 atlas_MySQL中间件-Atlas
- terminal的常用快捷键
热门文章
- 读《把时间当作朋友》
- 下雨天睡不够 去湿气功略拿走不谢
- Hive鲜为人知的宝石-Hooks
- Linux中的useradd命令,技术|Linux useradd 命令介绍
- MATLAB | 可视化 | 罗密欧与朱丽叶的数据统计
- 面试官:看你项目中用到了Hystrix,具体有什么用?
- 分布式缓存Redis Cluster在华泰证券的探索与实践
- TYVJ 1391 走廊泼水节
- 业余学Python是如何挣钱的?用Python赚钱的5个方法,教你业余时间赚外快!
- 计算机管理任务计划程序全部禁用,Win10系统设置任务计划程序出现“任务计划程序不可用”如何解决...