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

【编程之美】2.1 - 求二进制数中1的个数

  • 问题描述:对于一个字节(8bit)的无符号整形变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高。

  • 解法一:利用整形数据除法的特点,通过相除和判断余数的值来分析
int Count(BYTE v) { int num = 0; while(v) { if(v % 2 == 1) { num++; } v = v/ 2; } return num; }
  • 解法二:利用向右移位操作来达到上面的相处的效果
int Count(BYTE v) { int num = 0; while(v) { num += v & 0x01; v >>= 1; } return num; }
  • 解法三:在每次判断中,仅与1来进行判断【不易想到,较为巧妙】
int Count(BYTE v) { int num = 0; while(v) { v &= (v-1); num++; } return num; }
  • 解法四:使用分支操作:因为只有8位数据,直接把0~255的情况都进行罗列【使用了空间换时间的方法】
int Count(BYTE v) { int num = 0; switch (v) { case 0x0: num = 0; break; case 0x1: case 0x2: case 0x4: case 0x8: case 0x10: case 0x20: case 0x40: case 0x80: num = 1; break; case 0x3: case 0x6: case 0xc: case 0x18: case 0x30: case 0x60: case 0xc0: num = 2; break; //... } return num; }
  • 解法五:查表法【时间复杂度为O(1)】,在一个需要频繁使用这个算法的应用中,通过“空间换时间”来获取高的时间效率是一个常用的方法。
/* 预定义的结果表 */ int countTable[256] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 }; int Count(BYTE v)) { //check parameter return countTable[v]; }



相关文章:

  • JavaScript中数组的排序方法:1.冒泡排序 2.选择排序
  • js计算页面加载时间
  • Solium代码测试框架
  • 迎接第五次工业革命浪潮,不当纳米知识文盲
  • 12-单表查询
  • Microsoft Component Designer 设计组件一例
  • 百度云高速下载Pandownload
  • CF卡格式化XPE启动盘
  • BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题
  • Linux 抓取网页实例(shell+awk)
  • 计算机网络--TCP三次握手和四次挥手
  • 纳米技术是云计算的大救星
  • set集合的常用方法
  • lua和测试(一)
  • Qt 事件处理机制 (上篇)
  • SegmentFault for Android 3.0 发布
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 2017前端实习生面试总结
  • IDEA常用插件整理
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Vue全家桶实现一个Web App
  • 百度地图API标注+时间轴组件
  • 解析带emoji和链接的聊天系统消息
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 每天10道Java面试题,跟我走,offer有!
  • 面试总结JavaScript篇
  • 模型微调
  • 目录与文件属性:编写ls
  • 前端
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 学习ES6 变量的解构赋值
  • 用Visual Studio开发以太坊智能合约
  • 转载:[译] 内容加速黑科技趣谈
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • raise 与 raise ... from 的区别
  • scrapy中间件源码分析及常用中间件大全
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 数据库巡检项
  • ​configparser --- 配置文件解析器​
  • ​力扣解法汇总946-验证栈序列
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (2)MFC+openGL单文档框架glFrame
  • (2)nginx 安装、启停
  • (Git) gitignore基础使用
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (一)基于IDEA的JAVA基础10
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 8.0 发布到 IIS
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .Net Remoting常用部署结构