求一个整数二进制中1的个数(三种方法详解)

news2024/10/5 13:50:22

越过寒冬

前言

今天复习了一些操作符的知识,看到了这道题,并且发先有三种解题思路,觉得有趣,据记下来与诸位分享一下。

题目

写一个函数,给定一个整数,求他的二进制位中1的个数

思路1

既然是二进制位那自然是想到了按位与按位或他们几个

可以这样写

因为整形是32个比特位,所以for循环32次,通过&1判断出当前最后一位是否为1,通过>>i不断调整最后一位,直到32位全部检查完毕

#include<stdio.h>
int counts(int a)
{
	int num = 0;
for(int i=0;i<32;i++)
if((a >>i)&1)
		num++;
	return num;
}
int main()
{
	printf("%d",counts(20));

	return 0;
}

思路2

我们还可以用“/”,和“%”来代替右移操作符即>>

但是要注意,把函数的参数设置为无符号数,因为如果是负数的话要是用有符号数接受就会算不出来

#include<stdio.h>
int counts(unsigned int a)
{
	int num = 0;
	while (a)
	{if (a % 2)
			num++;
	a /= 2;
}
	return num;
}
int main()
{
	printf("%d",counts(-1));
	return 0;
}

思路三

这个思路就很巧妙了

我们首先发现n&=(n-1)可以把n二进制位最右边的1改为0

于是有思路

#include<stdio.h>
int counts( int a)
{
	int num = 0;
	if (a)
		num++;
	while (a & (a - 1))
	{
		a &= (a - 1);
		num++;
	}
	return num;
}
int main()
{
	printf("%d",counts(3));
	return 0;
}

但是在这里,我们把num的值分了情况判断是否++,为什么呢

举个例子就好了:

传个2进去,则2&(2-1)==0,可是2的二进制位里有一个1,所以,懂了吗,要先个他赋值为1

可是还有一个特殊情况----传参为0时,于是要先判断传参是不是0,在决定num是否++。

总结

当涉及到二进制时就要想到按位操作符,右移左移操作符了,同时也可以在有时间的情况下探索一下是否有更多思路。今天的分享就到这里啦,觉得有帮助就点个赞支持一下吧,谢谢!

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

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

相关文章

JOSEF约瑟 断电延时继电器 SRTD-220VDC-2H2D 导轨安装

系列型号&#xff1a; SRTD-24VDC-1H1D断电延时继电器&#xff1b;SRTD-110VDC-1H1D断电延时继电器&#xff1b; SRTD-220VDC-1H1D断电延时继电器&#xff1b;SRTD-110VAC-1H1D断电延时继电器&#xff1b; SRTD-220VAC-1H1D断电延时继电器&#xff1b;SRTD-24VDC-2H断电延时继电…

一文搞懂手机卡的定向流量到底是什么!

最近有一些小伙伴对于手机卡流量中包含的定向流量这个概念不是很明白&#xff0c;而且也不知道具体如何使用&#xff0c;今天这个视频&#xff0c;葫芦弟就仔细给大家讲解一下&#xff0c;希望能解开小伙伴们心中的疑惑。废话不多说&#xff0c;我们直接进入正题&#xff01; 首…

网络安全—模拟ARP欺骗

文章目录 网络拓扑安装使用编辑数据包客户机攻击机验证 仅做实验用途&#xff0c;禁止做违法犯罪的事情&#xff0c;后果自负。当然现在的计算机多无法被欺骗了&#xff0c;开了防火墙ARP欺骗根本无效。 网络拓扑 均使用Windows Server 2003系统 相关配置可以点击观看这篇文章…

git rebase(变基)应用场景

文章目录 git rebase(变基)应用场景1.git rebase -i HEAD~3 git rebase(变基)应用场景 使得提交记录变得简洁 现在我们模拟我们有多次提交记录&#xff0c;本地仓库有三条提交 整合成一条提交记录 1.git rebase -i HEAD~3 提交记录合并 HEAD~3合并三条记录 执行之后 然后把…

【Python机器学习】构建简单的k近邻算法模型

k近邻算法是一个很容易理解的算法&#xff0c;构建模型只需要保存训练数据集。要对一个新的数据点做出预测&#xff0c;算法会在训练集中寻找与这个新数据点距离最近的数据点&#xff0c;然后将找到的数据点的标签赋值给这个新数据点。 l近邻算法中k的含义是&#xff1a;我们可…

Ubuntu 常用命令之 locate 命令用法介绍

&#x1f525;Linux/Ubuntu 常用命令归类整理 locate命令是在Ubuntu系统下用于查找文件或目录的命令。它使用一个预先构建的数据库&#xff08;通常由updatedb命令创建&#xff09;来查找文件或目录&#xff0c;因此它的查找速度非常快。 plocate 安装 locate 不是 Ubuntu 系…

jdk动态代理中invoke的return返回的值有什么用?

目录 首先在接口中定义一个行为再定义一个目标角色实现接口&#xff0c;实现行为去代理角色类中解决一下报错&#xff0c;但是什么都不要写 invoke的return返回的值是调用方法中返回的值 下面我们来实例看一下 首先在接口中定义一个行为 public String toMarry02();再定义一个…

【论文阅读|冷冻电镜】DISCA: High-throughput cryo-ET structural pattern mining

论文题目 High-throughput cryo-ET structural pattern mining by unsupervised deep iterative subtomogram clustering 摘要 现有的结构排序算法的吞吐量低&#xff0c;或者由于依赖于可用模板和手动标签而固有地受到限制。本文提出了一种高吞吐量的、无需模板和标签的深度…

开源大模型应用开发

1.大语言模型初探 ChatGLM3简介 ChatGLM3-6B 是一个基于 Transformer 的预训练语言模型&#xff0c;由清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同训练发布。该模型的基本原理是将大量无标签文本数据进行预训练&#xff0c;然后将其用于各种下游任务&#xff0c;例如文…

c++基础(对c的扩展)

文章目录 命令空间引用基本本质引用作为参数引用的使用场景 内联函数引出基本概念 函数补充默认参数函数重载c中函数重载定义条件函数重载的原理 命令空间 定义 namespace是单独的作用域 两者不会相互干涉 namespace 名字 { //变量 函数 等等 }eg namespace nameA {int num;v…

力扣每日一题99:恢复二叉搜索树

题目 给你二叉搜索树的根节点 root &#xff0c;该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下&#xff0c;恢复这棵树 。 示例 1&#xff1a; 输入&#xff1a;root [1,3,null,null,2] 输出&#xff1a;[3,1,null,null,2] 解释&#xff1a;3 不能是 1 …

数脉观察二丨 详解CroPoolv2.0锁仓收益机制 文末附锁仓教程

1月1日元旦佳节期间&#xff0c;CyberVein基金会支持打造的CroPoolv2.0最新版本正式上线&#xff0c;获得了圈内媒体和知名KOL多方的关注&#xff0c;在Staking领域掀起了热议&#xff0c;用户可以前往CroPool.net进行锁仓体验。 CroPool v2.0新增“锁仓”功能板块&#xff0c…

findata——科学数据搜索引擎

findata由中国科学院计算机网络信息中心提供&#xff0c;具有很强的数据检索能力。 网址如下&#xff1a;https://www.findata.cn/ 主界面十分简洁 我们试着输入landsat&#xff0c;点击搜索按钮&#xff0c;给出以下结果。 我们还可以添加条件&#xff0c;进一步进行筛选 数…

three.js gltf后处理颜色异常(伽马校正)

效果&#xff1a; 应用了伽马校正&#xff0c;好像效果不明显 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"><…

RocketMQ5.0消息过滤

前言 消费者订阅了某个主题后&#xff0c;RocketMQ 会将该主题中的所有消息投递给消费者。若消费者只需要关注部分消息&#xff0c;可通过设置过滤条件在 Broker 端进行过滤&#xff0c;只获取到需要关注的消息子集&#xff0c;避免接收到大量无效的消息。 以电商交易场景为例…

手机视频监控客户端APP如何实现跨安卓、苹果和windows平台,并满足不同人的使用习惯

目 录 一、手机视频监控客户端的应用和发展 二、手机视频监控客户端存在的问题 三、HTML5视频监控客户端在手机上实现的方案 &#xff08;一&#xff09;HTML5及其优点 &#xff08;二&#xff09;HTML5在手机上实现视频应用功能的优势 四、手机HTML5…

FFmpeg之——获取上传视频的尺寸(长、宽)

获取上传视频的尺寸&#xff1a; 获取视频尺寸通常需要借助第三方库FFmpeg。 首先&#xff0c;确保你的系统中已安装了FFmpeg&#xff0c;并且FFmpeg的可执行文件路径已经添加到你的系统环境变量中。 1.官网下载ffmpeg 进入 链接: ffmpeg官网 网址&#xff0c;点击下载wind…

milvus学习(一)cosin距离和欧式距离

参考&#xff1a;https://blog.csdn.net/qq_36560894/article/details/115408613 归一化以后的cosin距离和欧式距离可以相互转化&#xff0c;未归一化的不可以相互转化&#xff08;因为距离带单位&#xff09;。

AI的明天从这里开始:OJAC近屿智能带您探索AIGC星辰大海的无限可能!

你是对人工智能充满好奇的编程小白&#xff0c;还是渴望工作赋能的白领&#xff1f;或者是想投身AIGC浪潮的创业者&#xff1f;无论你的背景如何&#xff0c;只要你对AI世界充满热情&#xff0c;我们OJAC近屿智能AIGC星辰大海大模型工程师和产品经理启航班以及系列课程都欢迎您…

利用Spring Cloud和Java系统设置优化工程项目管理系统源码的二次开发体验

工程项目管理涉及众多环节和角色&#xff0c;如何实现高效协同和信息共享是关键。本文将介绍一个采用先进技术框架的Java版工程项目管理系统&#xff0c;该系统支持前后端分离&#xff0c;功能全面&#xff0c;可满足不同角色的需求。从项目进度图表到施工地图&#xff0c;再到…