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

剑指offer14_二进制中1的个数

二进制中1的个数


输入一个 32位整数,输出该数二进制表示中 1 的个数。

注意

  • 负数在计算机中用其绝对值的补码来表示。
数据范围

−100≤ 输入整数 ≤100

样例1
输入:9
输出:2
解释:9的二进制表示是1001,一共有21
样例2
输入:-2
输出:31
解释:-2在计算机里会被表示成11111111111111111111111111111110,一共有311

算法描述

通过迭代计算整数 n 的二进制表示中 1 的个数,步骤如下:

  1. 转换为无符号整数:避免负数右移时的符号扩展问题
  2. 循环直到 n = 0
    • 检查最低位是否为 1n & 1 == 1 则计数器 +1
    • 右移一位:n = n >> 1(无符号右移自动补0)
  3. 返回计数器值
时间复杂度

O ( log ⁡ n ) O(\log n) O(logn)
每次迭代将 n n n 减半(右移一位),最多执行 log ⁡ 2 n \log_2 n log2n

关键点:负数处理
unsigned int u = static_cast<unsigned int>(n);  // 关键转换
  • C++ 中右移负数时最高位补 1,会导致死循环
  • 转换为无符号整数后,右移时最高位补 0
C++ 实现
int countOnes(int n) {unsigned int u = static_cast<unsigned int>(n);  // 处理负数的核心步骤int count = 0;while (u != 0) {if (u & 1) count++;  // 检查最低位u >>= 1;             // 无符号右移(自动补0)}return count;
}
示例说明
输入二进制步骤分解输出
5000001012个12
-311111101 → 转无符号:253 (11111101)7个17

注意:负数的二进制补码表示在转换为无符号整数时,其原始位模式保持不变,但右移行为变为逻辑移位(补0)而非算术移位(补符号位)。

http://www.xdnf.cn/news/10842.html

相关文章:

  • 谷歌地图免费下载手机版
  • OpenLayers 地图标注之Popup标注
  • 符号执行与SemFix、DirectFix 、Angelix的主要思想
  • 【Bluedroid】蓝牙启动之sdp_init 源码解析
  • Matlab回归预测大合集又更新啦!新增2种高斯过程回归预测模型,已更新41个模型!性价比拉满!
  • SQL 筛选出在表1但不在表2中的数据
  • 消费者行为变革下开源AI智能名片与链动2+1模式S2B2C商城小程序的协同创新路径
  • 大模型:从基座构建到应用落地--预训练与后训练及个人解析-2025.6
  • 【原神 × 二分查找】找出圣遗物强化到暴击的最小尝试次数!
  • vLLM:让大语言模型推理更高效的新一代引擎 —— 原理详解一
  • String 学习总结
  • WPS 利用 宏 脚本拆分 Excel 多行文本到多行
  • 数据可视化有哪些步骤?2025高效落地指南
  • 机器学习与深度学习08-随机森林02
  • 记我的第一个深度学习模型尝试——MNIST手写数字识别
  • 可视化大屏工具对比:GoView、DataRoom、积木JimuBI、Metabase、DataEase、Apache Superset 与 Grafana
  • 使用Redis作为缓存优化ElasticSearch读写性能
  • 各个主要目录的功能 / Linux 常见指令
  • 车载软件架构 --- 软件定义汽车开发模式思考
  • RagFlow优化代码解析
  • 完美解决在pycharm中创建Django项目安装mysqlclient报错的问题(windows下)
  • Read View在MVCC里如何工作
  • 【Pandas】pandas DataFrame rename
  • Spring中@Controller和@RestControlle注解的区别
  • leetcode hot100刷题日记——37.三数之和
  • 光伏功率预测新突破:TCN-ECANet-GRU混合模型详解与复现
  • 网络安全运维实训室建设方案
  • Tauri(2.5.1)+Leptos(0.7.8)开发桌面应用--简单的工作进度管理
  • 攻防世界RE-1000Click
  • 深入理解 JSX:React 的核心语法