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

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

题目描述

实现一个函数,输入一个整数,输出该数二进制表示中1的个数。
例如,把9表示成二进制是1001,则输出为2

常规解法

首先把n和1做位运算,判断n的最低位是不是1,然后把1左移一位得到2,再把n和2做位运算,判断n的次低位是不是1…这样反复左移。
循环的次数等于整数二进制的位数,32位的整数需要循环32次。

class Solution {

int NumberOfOne(int n){
int cnt = 0;
unsigned int flag = 1;
while(flag){
if(n & flag){
++cnt;
}
flag = flag << 1;
}
return cnt;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
惊喜解法
把一个整数减去1,在和原整数做与运算,会把该整数最右边的1变成0。
那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
以1100为例,它减去1的结果是1011,再把1100和1011做位与运算,得到的结果是1000,
然后1000减去1,得到0111,与1000做位与运算,得到的结果是0000,故得到1100有两个1。

class Solution {

int NumberOfOne1(int n){
int cnt = 0;
while(n){
++cnt;
n = (n - 1) & n;
}
return cnt;
}
};
1
2
3
4
5
6
7
8
9
10

---------------------

转载于:https://www.cnblogs.com/ly570/p/11109351.html

你可能感兴趣的文章
windows下的文件管理工具--total commander
查看>>
sizeof(类名字)
查看>>
四元数
查看>>
功率谱密度如何理解
查看>>
git clean解决 GIT error: The following untracked working tree files would be overwritten
查看>>
windows下的计算时间间隔 -- GetTickCount()
查看>>
Excel在数据表中悬停鼠标显示数据值
查看>>
UML类图知识
查看>>
香农的伟大论文《A Symbolic Analysis of Relay and Switching Circuits》
查看>>
OpenMark
查看>>
c++11 enum class用法
查看>>
excel中怎么将行转换为列及列转换成行
查看>>
git 版本(commit) 回退
查看>>
c++ 数值计算库Eigen
查看>>
CodeMeter 软件加密技术
查看>>
git 版本库之间的依赖
查看>>
仓库服务端软件artifactory
查看>>
Vulkan(0)搭建环境-清空窗口
查看>>
Vulkan(1)用apispec生成Vulkan库
查看>>
python全栈开发中级班全程笔记(第三模块、第一章(1.面向对象基础))
查看>>