博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer—二进制中1的个数
阅读量:4214 次
发布时间:2019-05-26

本文共 677 字,大约阅读时间需要 2 分钟。

这道题要判断一个int类型数据的二进制中1的个数。

看到二进制就会联想到位运算符:异或、与、取反、或、左移和右移。
判断1的个数,就会想到与1相与。1实际上是0000…1的简写,所以输入n与1相与实际上就是在判断最后1位是否为1。是结果为1,否结果为0.
每次判断完之后,n向后移动一位,继续判断下一位。
对于正数可以采用以下代码

int  NumberOf1(int n) {
int cnt=0; while(n!=0) {
cnt+=n&1; n>>=1; } return cnt; }

但是在负数的时候,这么做会产生一个问题:输入可能为负数。负数和正数的区别在于向右移位的时候,正数左边补0,但是负数为了保持负号,补位的是1,导致循环不停止。这时候就需要把while改为for循环,因为输入的是int类型,总共32位,所以for循环32次.

int  NumberOf1(int n) {
int cnt=0; for(int i=0;i<32;++i) {
cnt+=n&1; n>>=1; } return cnt; }

这样的好处在于不用区分负数和正数,因为只循环32次,没有理会左边补位1还是0.时间复杂度,空间复杂度均为O(1)。

转载地址:http://qndmi.baihongyu.com/

你可能感兴趣的文章
测试之途,前途?钱途?图何?
查看>>
adb常用命令
查看>>
通过LR监控Linux服务器性能
查看>>
通过FTP服务的winsockes录制脚本
查看>>
LRwinsocket协议测试AAA服务器
查看>>
Net远程管理实验
查看>>
反病毒专家谈虚拟机技术 面临两大技术难题
查看>>
几种典型的反病毒技术:特征码技术、覆盖法技术等
查看>>
Software Security Testing软件安全测试
查看>>
论文浅尝 | 通过共享表示和结构化预测进行事件和事件时序关系的联合抽取
查看>>
论文浅尝 | GMNN: Graph Markov Neural Networks
查看>>
廖雪峰Python教程 学习笔记3 hello.py
查看>>
从内核看epoll的实现(基于5.9.9)
查看>>
python与正则表达式
查看>>
安装.Net Framework 4.7.2时出现“不受信任提供程序信任的根证书中终止”的解决方法
查看>>
input type=“button“与input type=“submit“的区别
查看>>
解决Github代码下载慢问题!
查看>>
1.idea中Maven创建项目及2.对idea中生命周期的理解3.pom文件夹下groupId、artifactId含义
查看>>
LeetCode-栈|双指针-42. 接雨水
查看>>
stdin,stdout,stderr详解
查看>>