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

剑指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.lqws.cn/news/97993.html

相关文章:

  • 用HTML5 Canvas打造交互式心形粒子动画:从基础到优化实战
  • 链表题解——反转链表【LeetCode】
  • (三)动手学线性神经网络:从数学原理到代码实现
  • 机器学习——主成分分析PCA
  • 数据库密码加密
  • lanqiaoOJ 1508:N皇后问题 ← dfs
  • SpringBoot项目打包成war包
  • Kdump 介绍与使用方式
  • Samtec技术支持 | 新型评估和开发套件
  • Agno:使用简单代码构建AI智能体
  • 百万级临床试验数据库TrialPanorama发布!AI助力新药研发与临床评价迎来新基石
  • MySQL - Windows 中 MySQL 禁用开机自启,并在需要时手动启动
  • 编译 Linux openssl
  • Asp.net core 使用EntityFrame Work
  • 一、基础环境配置
  • Walle-Web:打造轻量级高效的DevOps自动化部署平台
  • 【数据库】《DBA实战手记》- 读书笔记
  • centos中的ulimit命令
  • Python数据分析及可视化中常用的6个库及函数(一)
  • 【JAVA版】意象CRM客户关系管理系统+uniapp全开源
  • python调用硅基流动的视觉语言模型
  • Python基于SVM技术的手写数字识别问题项目实战
  • Vue3 + Vite:我的 Qiankun 微前端主子应用实践指南
  • 研发型企业如何面对源代码保密问题
  • one-hot编码VS对象嵌入表示
  • Java详解LeetCode 热题 100(25):LeetCode 141. 环形链表(Linked List Cycle)详解
  • 架构设计的目标:高内聚、低耦合的本质
  • 【文献精读】Explaining grokking through circuit efficiency
  • Unity 性能优化终极指南 — GameObject 篇
  • SIFT算法详细原理与应用