C语言:写一个函数返回参数二进制中 1 的个数(三种思路)

news2024/11/28 20:54:45

题目:

链接:二进制中1的个数__牛客网
来源:牛客网
             

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

            

示例:

输入

10

输出

2

说明

十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1

                    

 =========================================================================

                       

思路一:使用 %2/2 取出每一位并判断

总体思路:

(一). 创建函数参数要设置成无符号整数设置计数器计算1的个数

               

(二). 使用 while循环 循环判断二进制每一位

使用 %2 判断最低位是否为 1

使用 /2 去掉判断了的最低位,下次循环开始判断新的最低位

                


                 

第一步:

(1). 创建函数 number_of_1 ,

              

返回值 int  -- 返回计数器,

           

函数参数 unsigned int m -- 要设置成无符号整数,不然无法判断负数,

因为有符号整数的最高位是符号位不是有效数字

       

(2). 设置 计数器count -- 统计 函数参数二进制中 1 的个数

                     

实现代码:

#include <stdio.h>

//创建函数:
int number_of_1(unsigned int m)
{
	//设置 计数器count :
	int count = 0;
}

int main()
{
	
	return 0;
}

实现图片:

                 


                 

第二步:

(1). 使用 while循环 循环判断二进制每一位

           

(2). 使用 %2 判断 最低位是否为1是则 count++ 

                   

(3). 使用 /2 去掉判断了的最低位,下次循环开始判断新的最低位

                     

(4). 循环结束后返回 计数器count

                    

实现代码:

#include <stdio.h>

//创建函数:
int number_of_1(unsigned int m)
{
	//设置 计数器count :
	int count = 0;

	//使用 while循环 :
	while (m) //如果 m 不为0,说明二进制中还有1
	{
		if (m % 2 == 1)
		//使用 %2 判断最低位是否为1
		{
			count++; //是则 count++
		}
		m /= 2; //去掉二进制最低位
	}

	//放回 计数器 :
	return count;
}

int main()
{
	
	return 0;
}

实现图片:

                 


                 

第三步:

编写主函数

                 

(1). 输入要判断的数字

                

(2). 调用函数 number_of_1

               

(3). 打印结果 

                     

实现代码:

#include <stdio.h>

//创建函数:
int number_of_1(unsigned int m)
{
	//设置 计数器count :
	int count = 0;

	//使用 while循环 :
	while (m) //如果 m 不为0,说明二进制中还有1
	{
		if (m % 2 == 1)
		//使用 %2 判断最低位是否为1
		{
			count++; //是则 count++
		}
		m /= 2; //去掉二进制最低位
	}

	//放回 计数器 :
	return count;
}

//编写主函数:
int main()
{
	//输入要判断的数字:
	int n = 0;
	scanf("%d", &n);

	//调用函数:
	int ret = number_of_1(n);

	//打印结果:
	printf("%d\n", ret);

	return 0;
}

实现图片:

                    

思路一:最终代码和实现效果

最终代码:


#include <stdio.h>

//创建函数:
int number_of_1(unsigned int m)
{
	//设置 计数器count :
	int count = 0;

	//使用 while循环 :
	while (m) //如果 m 不为0,说明二进制中还有1
	{
		if (m % 2 == 1)
		//使用 %2 判断最低位是否为1
		{
			count++; //是则 count++
		}
		m /= 2; //去掉二进制最低位
	}

	//放回 计数器 :
	return count;
}

//编写主函数:
int main()
{
	//输入要判断的数字:
	int n = 0;
	scanf("%d", &n);

	//调用函数:
	int ret = number_of_1(n);

	//打印结果:
	printf("%d\n", ret);

	return 0;
}

实现效果:

                    

 =========================================================================

                       

思路二:使用 移位操作符位操作符 进行判断

总体思路:

思路一 的基础上 修改 第二步

              

使用 for循环 ,因为有32位二进制位循环32次

            

使用 移位操作符>>按位与& 判断 最低位二进制是否为1

                


              

修改思路一第二步:

(1). 使用 for循环 ,因为有32位二进制位循环32次

            

(2). 使用 移位操作符>>按位与& 判断 最低位二进制是否为1,是则count++

                     

实现代码:

#include <stdio.h>

//创建函数:
int number_of_1(unsigned int m)
{
	//设置 计数器count :
	int count = 0;

	//使用 for循环 :
	int i = 0;
	for (i = 0; i < 32; i++)
	//因为有32位二进制位,循环32次
	{
		//使用 移位操作符>> 和 按位与& 判断最低位:
		if (((m >> i) & 1) == 1)
		//移动 i位 后再 按位与1,判断最低位
		//移动后 m 的值并没有变,所以可以一直移动
		{
			count++; //是 1 则计数++
		}
	}

	//放回 计数器 :
	return count;
}

//编写主函数:
int main()
{
	//输入要判断的数字:
	int n = 0;
	scanf("%d", &n);

	//调用函数:
	int ret = number_of_1(n);

	//打印结果:
	printf("%d\n", ret);

	return 0;
}

实现图片:

                    

思路二:最终代码和实现效果

最终代码:


#include <stdio.h>

//创建函数:
int number_of_1(unsigned int m)
{
	//设置 计数器count :
	int count = 0;

	//使用 for循环 :
	int i = 0;
	for (i = 0; i < 32; i++)
	//因为有32位二进制位,循环32次
	{
		//使用 移位操作符>> 和 按位与& 判断最低位:
		if (((m >> i) & 1) == 1)
		//移动 i位 后再 按位与1,判断最低位
		//移动后 m 的值并没有变,所以可以一直移动
		{
			count++; //是 1 则计数++
		}
	}

	//放回 计数器 :
	return count;
}

//编写主函数:
int main()
{
	//输入要判断的数字:
	int n = 0;
	scanf("%d", &n);

	//调用函数:
	int ret = number_of_1(n);

	//打印结果:
	printf("%d\n", ret);

	return 0;
}

实现效果:

                     

 =========================================================================

                       

思路三:

使用m = m & (m - 1) -- 这个表达式会让n的二进制中最右边的1消失

总体思路:

思路一 的基础上 修改 第二步

              

使用 while循环 ,如果m不为0,则m的二进制中还有1

            

使用 m = m & (m - 1)去掉m的二进制中最右边的1,再赋给m,以便下次循环判断

去掉一个1时计数器++

                


              

修改思路一第二步:

(1). 使用 while循环 ,如果m不为0,则m的二进制中还有1

            

(2). 使用 m = m & (m - 1)去掉m的二进制中最右边的1,再赋给m,以便下次循环判断

去掉一个1时计数器++

                     

实现代码:

#include <stdio.h>

//创建函数:
int number_of_1(unsigned int m)
{
	//设置 计数器count :
	int count = 0;

	//使用 while循环:
	while (m) //如果m不为0,则m的二进制中还有1
	{
		//使用公式:
		m = m & (m - 1); //去掉最右边的1
		count++; //计数器++
	}

	//放回 计数器 :
	return count;
}

//编写主函数:
int main()
{
	//输入要判断的数字:
	int n = 0;
	scanf("%d", &n);

	//调用函数:
	int ret = number_of_1(n);

	//打印结果:
	printf("%d\n", ret);

	return 0;
}

实现图片:

                    

思路三:最终代码和实现效果

最终代码:

#include <stdio.h>

//创建函数:
int number_of_1(unsigned int m)
{
	//设置 计数器count :
	int count = 0;

	//使用 while循环:
	while (m) //如果m不为0,则m的二进制中还有1
	{
		//使用公式:
		m = m & (m - 1); //去掉最右边的1
		count++; //计数器++
	}

	//放回 计数器 :
	return count;
}

//编写主函数:
int main()
{
	//输入要判断的数字:
	int n = 0;
	scanf("%d", &n);

	//调用函数:
	int ret = number_of_1(n);

	//打印结果:
	printf("%d\n", ret);

	return 0;
}

实现效果:

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

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

相关文章

从零开始 Spring Boot 40:定时任务

从零开始 Spring Boot 40&#xff1a;定时任务 图源&#xff1a;简书 (jianshu.com) 定时任务是一种很常见的需求&#xff0c;比如我们可能需要应用定期去执行一些清理工作&#xff0c;再比如可能需要定期检查一些外部服务的可用性等。 fixedDelay 要在 Spring 中开启定时任…

深度学习笔记之Transformer(一)注意力机制基本介绍

深度学习笔记之Transformer——注意力机制基本介绍 引言回顾&#xff1a; Seq2seq \text{Seq2seq} Seq2seq模型中的注意力机制注意力机制的简单描述注意力机制的机器学习范例&#xff1a; Nadaraya-Watson \text{Nadaraya-Watson} Nadaraya-Watson核回归 Nadaraya-Watson \text…

编程必备:JAVA多线程详解

目录 前言 1.入门多线程 1.1. 线程、进程、多线程、线程池 1.2.并发、串行、并行 1.3. 线程的实现方式 1.3.1. 继承 Thread 类 1.3.2. 实现 Runnable 接口 1.3.3. 使用 Callable 和 Future 1.3.4. 使用线程池 1.4.线程的状态 1.5. 线程常用方法 1.5.1 sleep() 1.4…

验证码识别系统Python,基于CNN卷积神经网络算法

一、介绍 验证码识别系统&#xff0c;使用Python作为主要开发语言&#xff0c;基于深度学习TensorFlow框架&#xff0c;搭建卷积神经网络算法。并通过对数据集进行训练&#xff0c;最后得到一个识别精度较高的模型。并基于Django框架&#xff0c;开发网页端操作平台&#xff0…

基于Java网上花店系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Prompt 范式产业实践分享!基于飞桨 UIE-X 和 Intel OpenVINO 实现跨模态文档信息抽取

近期 Prompt 范式备受关注&#xff0c;实际上&#xff0c;其思想在产业界已经有了一些成功的应用案例。中科院软件所和百度共同提出了大一统诸多任务的通用信息抽取技术 UIE&#xff08;Universal Information Extraction&#xff09;。截至目前&#xff0c;UIE 系列模型已发布…

【JavaEE】网络原理——传输层协议:UDP和TCP

目录 1、简单了解应用层协议 2、传输层UDP协议 3、传输层TCP协议 3.1、TCP报文介绍 3.2、TCP实现可靠传输的核心机制 3.2.1、确认应答 3.2.2、超时重传 3.3、连接管理 &#xff08;三次挥手&#xff0c;四次握手&#xff09; 3.3.1、建立连接&#xff08;三次握手&a…

Java-API简析_java.lang.Enum<E extends Enum<E>>类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131212897 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

接口自动化测试丨如何实现多套环境的自动化测试?

在敏捷迭代的项目中&#xff0c;通常会将后台服务部署到多套测试环境。那么在进行接口自动化测试时&#xff0c;则需要将服务器的域名进行配置。使用一套接口测试脚本&#xff0c;通过切换域名地址配置&#xff0c;实现多套环境的自动化测试。 实战练习 分别准备两套测试环境…

Redis的单线程模型和标准Reactor线程模型的关系

文章目录 Redis到底是不是单线程&#xff1f;标准Reactor线程模型单reactor单线程单reactor多线程多reactor多线程 redis6.0 之前的单线程模型redis6.0 之后的单线程模型为什么redis最初选择的单线程网络模型&#xff1f;为什么redis6.0 io读写要用多线程&#xff1f; Redis 6.…

索尼RSV视频修复方法论视频文件修复时样本文件的三同

索尼RSV类的文件修复案例有很多&#xff0c;程序操作也很简单没什么可说的&#xff0c;这次这个索尼ILCE-7SM3的案例就是为了让大家更好的认识视频修复中我称之为“三同“的重要性&#xff0c;想要恢复的效果好必须要把准备工作做到位。 故障文件:45.1G RSV文件 故障现象: 索…

软件渗透测试是什么?软件产品哪种情况下需要做渗透测试?

随着互联网的普及&#xff0c;软件的开发方越来越多&#xff0c;但是随之而来的也是信息安全方面的问题。在软件开发过程中&#xff0c;安全问题一定要被重视&#xff0c;因为漏洞和安全问题一旦被黑客利用&#xff0c;会给公司和用户带来巨大的损失。为了避免这种情况的发生&a…

语音工牌在运营商智慧装维场景,有何应用价值?

客户精细化运营时代&#xff0c;如何做好客户服务体验&#xff0c;提升品牌美誉度和好感度&#xff0c;是众多企业开始思考的问题。 在运营商行业&#xff0c;上门装维和营业厅服务场景是企业与客户直接互动最多的地方。这个过程的服务质量直接影响到客户成交率、客户投诉率和…

软件测试金融银行项目如何测?从业务到测试实战,超细总结整理...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 金融行业的业务特…

chatgpt赋能python:Python怎么打备注?让你的代码更加清晰易懂

Python怎么打备注&#xff1f;让你的代码更加清晰易懂 Python是一种流行的编程语言&#xff0c;可以用来构建不同类型的应用程序&#xff0c;从网站到数据分析。无论您是初学者还是经验丰富的开发人员&#xff0c;写清晰&#xff0c;易于理解的代码都是非常重要的&#xff0c;…

Linux之ACL权限

目录 Linux之ACL权限 场景 设定ACL权限 ACL权限管理命令 参数及作用 给用户和用户组添加ACL权限 案例 创建 目录 /project 的所有者和所属组其他人权限设定为 770 创建旁听用户pt,并赋予ACL权限rx 查看目录/project的ACL权限 验证pt 用户对于 /project 目录没有写权…

el-element-admin实现双路由菜单

需求&#xff1a; 1、输入用户名登录企业级菜单 2、点击企业级菜单中的首页&#xff0c;右边显示项目列表&#xff0c;点击某一行跳转到项目级菜单 注意&#xff1a; 企业级菜单和项目级菜单&#xff0c;后端分别给接口 具体实施&#xff1a; 1、点击面包靴首页的时候设置标记…

第14届蓝桥杯国赛真题剖析-2023年5月28日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第149讲。 第14届蓝桥杯Scratch国赛真题&#xff0c;这是2023年5月28日上午举办的全国总决赛&#xff0c;比赛仍然采取…

基于java springboot的图书管理系统设计和实现

基于java springboot的图书管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录…

load_dataset加载huggingface数据集失败

1. 一般的加载方式 from datasets import load_dataset dataset_dict load_dataset(cmrc2018)这种加载方式可能会显示因为连接问题导致失败&#xff0c;此时可以在hugging face里面找到对应的页面下载下来 然后改一下代码&#xff1a; from datasets import load_dataset d…