求二进制中1的个数的几种解法
发布日期:2021-10-02 06:27:36 浏览次数:2 分类:技术文章

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

题目描述

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

求解思路1

我们可以设置一个无符号整数1,从低位往高位(1-32)一直移动,然后与整数对应位置的数字进行比较(与运算),来实现计算1的个数,代码如下:

class Solution {
public: int NumberOf1(int n) {
int count=0; unsigned int flag=1; while(flag){
if(n&flag){
count++; } flag<<=1;//左移一位 } return count; }};
运行时间:3ms占用内存:484k

求解思路2

一个非0的数n减去1的值我们计为tmp,则ntmp与运算后会得到下一个出现1的位置,我们将运算的结果赋给n,重新计算,这样的话有多少个1我们就计算多少次,而不是像思路1中的计算32

如四位二进制1000表示8,而8-1的四位二进制表示为0111,它们与运算的结果为0,因此,8的二进制中只有11,代码如下:

class Solution {
public: int NumberOf1(int n) {
int count=0; while(n){
count++; n=(n-1)&n; } return count; }};
运行时间:2ms占用内存:484k

转载地址:https://blog.csdn.net/Jeaten/article/details/108077399 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:不用库函数实现计算一个数的n次方
下一篇:剪绳子的几种解法 — C++实现

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月13日 12时10分06秒