【一刷《剑指Offer》】面试题 10:二进制中 1 的个数

力扣对应题目链接:191. 位1的个数 - 力扣(LeetCode)

牛客对应题目链接:二进制中1的个数_牛客题霸_牛客网


一、《剑指Offer》内容

核心考点 :二进制计算。

二、分析问题

1、循环检查二进制位

可以直接循环检查给定数字 n 的二进制的每一位是否为 1,那应该如何遍历二进制每一位呢?

可以考虑移位运算,每次移动一位即可。至于怎么统计到 1 呢?

我们都只知道数字 1 与数字相位与运算,其实只是最后一位为 1 就是 1,最后一位为 0 就是 0,这样我们就只需要将数字 1 移位运算,就可以遍历二进制的每一位,再去做位与运算,结果为 1 的就是二进制中为 1 的。

当检查第 i 位时,我们可以让 n 与 2^i 进行与运算,当且仅当 n 的第 i 位为 1 时,运算结果不为 0。

  1. 遍历二进制的 32 位,通过移位 0~31 次实现。
  2. 将移位后的 1 与数字进行位与运算,结果为 1 就记录一次。

2、位运算优化

性质:n&(n−1),会将 n 的二进制中最低位由 1 变成 0。

观察这个运算:n & (n−1),其运算结果恰为把 n 的二进制位中的最低位的 1 变为 0 之后的结果。这样我们就可以利用这个位运算的性质加速我们的检查过程,我们不断地让当前的 n 与 n−1 做与运算,直到 n 的二进制位全部变为 0 即可。因为每次运算会使得 n 的最低位的 1 被翻转为 0,因此运算次数就等于 n 的二进制位中 1 的个数。

  1. 使用循环检查 n 是否为 0。
  2. 不为 0 就与 n−1 做位与运算,去掉二进制最后一位的 1,并统计次数。


三、代码

1、循环检查二进制位(两种写法)

//牛客AC代码
class Solution {
public:int NumberOf1(int n) {int cnt=0;for(int i=0; i<32; i++){if(((n>>i)&1)==1)cnt++;}return cnt;}
};//力扣AC代码
class Solution {
public:int hammingWeight(int n) {int res=0;for(int i=0; i<32; i++){if((n>>i)&1==1)res++;}return res;}
};
//牛客AC代码
class Solution {
public:int NumberOf1(int n) {int cnt=0;for(int i=0; i<32; i++){if((n&(1<<i))!=0)cnt++;}return cnt;}
};//力扣AC代码
class Solution {
public:int hammingWeight(int n) {int res=0;for(int i=0; i<32; i++){if(n&(1<<i))res++;}return res;}
};

2、推荐:方法一(n & (n-1))

这种方法可以避免无效检测。

//牛客AC代码
class Solution {
public:int NumberOf1(int n) {int cnt = 0;while(n){n &= (n-1);cnt++;}return cnt;}
};//力扣AC代码
class Solution {
public:int hammingWeight(int n) {int res=0;while(n){res++;n&=(n-1);}return res;}
};

四、扩展

1、力扣相关题目链接:231. 2 的幂 - 力扣(LeetCode)


(1)分析题目

一个整数如果是 2 的整数次方,那么它的二进制表示中有且只有一位是 1,而其他所有位都是 0。根据前面的分析,把这个整数减去 1 之后再和它自己做与运算,这个整数中唯一的 1 就会变成 0。 


(2)代码 
class Solution {
public:bool isPowerOfTwo(int n) {if(n>0 && (n&(n-1))==0) return true;else return false;}
};

2、输入两个整数 m 和 n,计算需要改变 m 的二进制表示中的多少位才能得到 n。

(1)分析题目

比如 10 的二进制表示为 1010,13 的二进制表示为 1101,需要改变 1010 中的 3 位才能得到 1101。可以分为两步来解决这个问题:

  1. 求这两个数的异或。
  2. 统计异或结果中 1 的位数。

(2)代码
public class Solution {public int NumberOf1(int m, int n) {int num = m ^ n;int res = 0;while(num){num = num * (num-1);res++;}return res;}
}

五、举一反三

把一个整数减去 1 之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中的最右边一个 1 变成 0。很多二进制的问题都可以用这个思路解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/4338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot实现国际化以及部署Linux不生效问题

1、在application.properties 添加以下配置&#xff1a; #国际化配置 spring.messages.basenamei18n/messages/messages spring.messages.fallback-to-system-localefalse 2、添加配置文件在 resources目录下 如下图所示&#xff1a; 这个国际化文件命名有个坑&#xff0c;必须…

胸部X光图像分类:因果视角

Chest X-ray Image Classification: A Causal Perspective 摘要 这篇论文提出了一种新的方法来处理胸部X射线&#xff08;CXR&#xff09;分类问题&#xff0c;将因果推理融入到基于深度学习的方法中。尽管近年来深度学习在CXR分类方面取得了许多进展&#xff0c;但确保这些算…

【接口测试】JMeter接口关联测试

‍‍1 前言 我们来学习接口管理测试&#xff0c;这就要使用到JMeter提供的JSON提取器和正则表达式提取器了&#xff0c;下面我们来看看是如何使用的吧。 2 JSON提取器 1、添加JSON提取器 在线程组右键 > 添加 > 后置处理器 > JSON提取器 2、JSON提取器参数说明 N…

在浏览器中查看Revit模型:原理及实现

Greg Schleusner AIA 有一天向我提到&#xff0c;业内许多人认为带有 SVF2 的 Autodesk Viewer 是建筑模型最强大、性能最强的在线查看器之一&#xff0c;并且想知道开源 VIM 查看器和格式如何比较。 可以使用NSDT 3DConvert的 Revit插件 上传你的模型并在线查看预览&#xff…

怎么通过PHP语言实现远程控制棋牌室

怎么通过PHP语言实现远程控制棋牌室呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制棋牌室&#xff0c;通过专用的包间控制器&#xff0c;来实现包间内所有电器以及门锁的独立控制。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规…

BetterDisplay Pro for Mac:显示器校准软件

BetterDisplay Pro for Mac是一款出色的显示器校准软件&#xff0c;旨在提升你的视觉体验。它提供了准确的显示器参数调整&#xff0c;包括亮度、对比度、色温和色域等&#xff0c;让你的显示器呈现更真实、清晰、细腻的图像。此外&#xff0c;软件还提供多种预设模式和自定义选…

遥感雷达波段的原理及应用

雷达波段是不同波长的组。每一种都有其独特的穿透地球表面的能力。它们还可以揭示环境的不同方面。 雷达频段在电磁频谱内具有特定的频率范围。这些波段由 L-、S-、C- 和 X-波段等字母表示。稍后会详细介绍这一点。 什么是合成孔径雷达&#xff1f; 合成孔径雷达 (SAR) 是一…

后台图书管理系统:SSM整合开发案例

代码已经完善,文章内容会在后续补充 代码地址(https://javazhang.lanzn.com/ig8tf1wd2aba 密码:1234) 1.1 .SpringConfig 代码 Configuration ComponentScan({"com.itheima.service" }) PropertySource("classpath:jdbc.properties") Import({JdbcConfig…

【STM32+HAL】读取电池电量

一、准备工作 有关CUBEMX的初始化配置&#xff0c;参见我的另一篇blog&#xff1a;【STM32HAL】CUBEMX初始化配置 有关定时器触发ADC模式配置&#xff0c;详见【STM32HAL】ADC采集波形实现 有关软件触发ADC模式配置&#xff0c;详见【STM32HAL】三轴按键PS2摇杆 二、所用工具…

如何替代传统的方式,提高能源企业敏感文件传输的安全性?

能源行业是一个关键的基础设施领域&#xff0c;它涉及能源的勘探、开采、生产、转换、分配和消费。随着全球经济的发展和人口的增长&#xff0c;能源需求持续上升&#xff0c;这对能源行业的可持续发展提出了挑战。能源行业的传输场景多种多样&#xff0c;需要重点关注能源企业…

【热门话题】Chrome 插件研发详解:从入门到实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Chrome 插件研发详解&#xff1a;从入门到实践一、引言二、Chrome 插件基础概念…

应用实战 | 别踩白块小游戏,邀请大家来PK挑战~

“踩白块会输”是一个简单的微信小程序游戏&#xff0c;灵感来自当年火热的别踩白块游戏&#xff0c;程序内分成三个模块&#xff1a;手残模式、经典模式和极速模式&#xff0c;分别对应由易到难的三种玩法&#xff0c;可以查看游戏排名。动画效果采用JS实现&#xff0c;小程序…

多线程事务怎么回滚

1、背景介绍 1&#xff0c;最近有一个大数据量插入的操作入库的业务场景&#xff0c;需要先做一些其他修改操作&#xff0c;然后在执行插入操作&#xff0c;由于插入数据可能会很多&#xff0c;用到多线程去拆分数据并行处理来提高响应时间&#xff0c;如果有一个线程执行失败…

Git重修系列 ------ Git的使用和常用命令总结

一、Git的安装和配置 git安装&#xff1a; Git - Downloads git首次配置用户信息&#xff1a; $ git config --global user.name "kequan" $ git config --global user.email kequanchanqq.com $ git config --global credential store 配置 Git 以使用本地存储机…

mysql主库delete一个没主键的表导致从库延迟很久问题处理

一 问题描述 发现线上环境一个从库出现延迟&#xff0c;延迟了2天了&#xff0c;还没追上主库。 查看当前运行的sql及事务&#xff0c;发现这个sql语句是在delete一个没主键的表。 二 问题模拟 这里在测试环境复现下这个问题。 2.1 在主库造数据 use baidd; CREATE TABL…

【数据库】Redis

文章目录 [toc]Redis终端操作进入Redis终端Redis服务测试切换仓库 String命令存储字符串普通存储设置存储过期时间批量存储 查询字符串查询单条批量查询 Key命令查询key查询所有根据key首字母查询判断key是否存在查询指定的key对应的value的类型 删除键值对 Hash命令存储hash查…

软件测试_v模型_w模型

v模型&#xff1a; w模型&#xff1a; 一、V模型的8个阶段及其对应关系如下&#xff1a; 1. 需求分析&#xff1a;明确项目的需求&#xff0c;为后续设计提供依据。 2. 总体设计&#xff1a;根据需求分析&#xff0c;设计系统的总体架构。 3. 详细设计&#xff1a;在总体设计的…

在no branch上commit后,再切换到其他分支,找不到no branch分支的修改怎么办?

解决办法 通过git reflog我们可以查看历史提交记录&#xff0c;这里的第二条提交&#xff08;fbd3ea8&#xff09;就是我在no branch上的提交。 再通过git checkout -b backup fbd3ea8&#xff0c;恢复到上次提交的状态&#xff0c;并且为其创建个分支backup&#xff0c;此时…

(七)Servlet教程——Idea编辑器集成Tomcat

1. 点击桌面上Idea快捷方式打开Idea编辑器&#xff0c;假如没有创建项目的话打开Idea编辑器后的界面展示如下图所示 2. 点击界面左侧菜单中的自定义 3. 然后点击界面中的“所有设置...”,然后点击“构建、执行、部署”&#xff0c;选择其中的“应用程序服务器” 4. 点击“”按钮…

C语言-动态内存分配

即使行动导致错误&#xff0c;却也带来了学习与成长;不行动则是停滞与萎缩。&#x1f493;&#x1f493;&#x1f493; •&#x1f319;知识回顾 亲爱的友友们大家好&#xff01;&#x1f496;&#x1f496;&#x1f496;&#xff0c;我们紧接着要进入一个新的内容&#xff0c;…