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

求一个无符号整数二进制形式中1的个数(三种方法)

题目:

输入一个整数,输出这个整数二进制形式中1的个数。

例如:

输入:115

输出:5

解题思路:

方法一:

关键代码:i = i & (i-1),统计i二进制中有多少个1 

具体是如何实现的,实际推几步就可以看出规律。例如2017的二进制形式为11111100001

第一步,11111100001 & 11111100000 = 11111100000    count = 1

第二步,11111100000 & 11111011111 = 11111000000     count = 2

......

每一步结果都会减少一个二进制中的1,并且计数加一,实际上是在统计二进制中1的个数。

方法二:

要求一个数的二进制形式中1的个数,那么首先想到的是求其二进制。常用的方法为除二取余法,当得到的余数为1时,计数加一,从而实现题目要求。

方法三:

根据题目的要求,我想到了逐位去判断是否为1,若是的话则计数加一。那么就需要用到位运算的知识,我们知道1按位与上一个数不改变这个位,0按位与上一个数将这个位零。那么我只需将1不停左移并按位与上要判断的数每一位,就可以得到这个数二进制形式中1的个数。

程序代码:

方法一:

#include <stdio.h>
int return_1(unsigned int);
int main(int argc, char *argv[])
{ unsigned int num = 0;printf("请输入一个整形数据:");scanf("%u",&num);printf("该数据二进制中1的个数为:%d\n",return_1(num));return 0;
} 
int return_1(unsigned int num)
{int count = 0;while(num){num = (num)&(num-1);count++;}return count;
}

方法二: 

#include <stdio.h>
int return_1(unsigned int);
int main(int argc, char *argv[])
{ unsigned int num = 0;printf("请输入一个整形数据:");scanf("%u",&num);printf("该数据二进制中1的个数为:%d\n",return_1(num));return 0;
} 
int return_1(unsigned int num)
{int count = 0;while(num){if(num % 2 == 1){count++;}num = num / 2;}return count;
}

方法三: 

#include <stdio.h>
int return_1(unsigned int );
int main(int argc, char *argv[])
{ unsigned int num = 0;printf("请输入一个整形数据:");scanf("%u",&num);printf("该数据二进制中1的个数为:%d\n",return_1(num));return 0;
} 
int return_1(unsigned int num)
{int count = 0;int i = 0;while(i++ < 32)if(((1 << i) & num) != 0)count++;return count;
}

运行结果:

请输入一个整形数据:643698459
该数据二进制中1的个数为:16

http://www.mrgr.cn/news/54857.html

相关文章:

  • 23种设计模式具体实现方法
  • 如何删除Maven
  • Linux系统安装软件的4种方式【源码配置编译安装、yum安装、rpm包安装、二进制软件包安装(.rpm/.tar.gz/.tgz/.bz2)】
  • 如何使用Git推送本地搭建的仓库以及远程克隆的仓库
  • 深度解析模型调优与正则化:L1、L2正则化及偏差-方差的权衡
  • WSL2 构建Ubuntu系统-轻量级AI运行环境
  • DDD通用语言、多尿和尿频-《分析模式》漫谈41
  • 1. 解读DLT698.45-2017通信规约--预连接响应
  • upload-labs靶场Pass-05
  • 第五届人工智能与教育国际学术会议(ICAIE 2024)
  • (五)若使用LQR控制小车倒立摆,该如何对小车和摆杆的动力学方程线性化?哪些变量是可以进行简化的,线性化后的状态空间方程应该怎么列写
  • 瑞数后缀加密怎么处理
  • 大厂面试提问:Flash Attention 是怎么做到又快又省显存的?
  • 多线程编程
  • 多表使用use_hash hint
  • 操作系统学习笔记-1.3操作系统引导,虚拟机
  • Spark广播变量(类似小表广播)
  • 【入门篇】2.8 时钟(三)
  • 【Linux从入门到精通一】操作系统概述与Linux初识
  • 物联网智能技术的深入探讨与案例分析
  • go基础(一)
  • 大数据-MySQL集群
  • 【论文速看】DL最新进展20241020-Transformer量化加速、低光增强
  • 【云从】七、云数据库
  • 2. 解析DLT698.45-2017通信规约--正向有功总电能
  • [C++]ecplise C++新建项目跑hello world