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

越过寒冬

前言

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

题目

写一个函数,给定一个整数,求他的二进制位中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.mzph.cn/news/593389.shtml

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

相关文章

UI5与后端的文件交互(二)

文章目录 前言一、开发Action1. 创建Structure2. BEDF添加Action3. class中实现Action 二、修改UI5 项目1. 添加一个按钮2. 定义事件函数 三、测试及解析1. 测试2. js中提取到的excel流数据3. 后端解析 前言 这系列文章详细记录在Fiori应用中如何在前端和后端之间使用文件进行…

判断一个数字是否为奇数或偶数:

以下实例用于判断一个数字是否为奇数或偶数&#xff1a; 实例(Python 3.0) # Filename : test.py # author by : www.dida100.com # Python 判断奇数偶数 # 如果是偶数除于 2 余数为 0 # 如果余数为 1 则为奇数 num int(input("输入一个数字: ")) if (num % …

python中,将csv文件转换为txt文件的几种方法

方法一、使用 csv 模块&#xff1a; import csv# 读取CSV文件 csv_file_path data.csv txt_file_path data_txt.txtwith open(csv_file_path, r) as csv_file, open(txt_file_path, w) as txt_file:# 创建CSV读取器csv_reader csv.reader(csv_file)# 逐行读取CSV文件&#…

Java学习苦旅(十六)——List

本篇博客将详细讲解Java中的List。 文章目录 预备知识——初识泛型泛型的引入泛型小结 预备知识——包装类基本数据类型和包装类直接对应关系装包与拆包 ArrayList简介ArrayList使用ArrayList的构造ArrayList常见操作ArrayList遍历 结尾 预备知识——初识泛型 泛型的引入 我…

Glide加载不出图片与请求浏览器资源时中文转码问题

报错代码如图&#xff1a;Image load failed: Failed to load resourse 首先确保你的图片 URL 地址是正确的&#xff0c;可以通过在浏览器中直接访问这个 URL 来测试。另外&#xff0c;确保 URL 地址不包含特殊字符或空格&#xff0c;以免影响加载。 然后确定依赖库没有问题&am…

lwip发送组播数据问题

1、今天测试组播包发现&#xff0c;组播数据只能在默认网卡发送成功&#xff0c;多次交叉测试依然这样&#xff0c;所以和网卡的配置无关 &#xff08;我的是双网卡&#xff09; 2、最后搜源码看&#xff0c;才发现有一段代码如下&#xff1a; struct netif * ip4_route(cons…

如何选择高防服务器

高防服务器是指抗DDos能力在50G以上的单个独立服务器&#xff0c;检查服务器可能存在的安全漏洞&#xff0c;提高业务的安全与稳定性&#xff0c;同时高防服务器也是服务器的一种。那我们该如何选择高防服务器呢&#xff0c;让小编来给大家谈一谈吧。 选择适合自己的防御 高防…

Ubuntu安装和配置ssh教程

在Ubuntu上安装和配置SSH&#xff08;Secure Shell&#xff09;是一个相对直接的过程。SSH允许您安全地访问和管理远程服务器。以下是安装和配置SSH的基本步骤&#xff1a; 安装SSH 打开终端: 在Ubuntu上&#xff0c;按下 Ctrl Alt T 打开终端。 更新软件包列表: 输入以下…

四、HTML 属性

属性是 HTML 元素提供的附加信息。 一、HTML 属性 HTML 元素可以设置属性属性可以在元素中添加附加信息属性一般描述于开始标签属性总是以名称/值对的形式出现&#xff0c;比如&#xff1a;name"value"。 二、 属性实例 HTML 链接由 <a> 标签定义。链接的地…

【hyperledger-fabric】将智能合约部署到通道

简介 本文主要来自于B站视频教学视频&#xff0c;也主要参看了官方文档中下图这一章节。针对的是测试网络中go语言的部分&#xff0c;部署测试网络。附上B站的教学视频 B站教学视频第一小节&#xff0c;附上 官方文档 1.启动网络 # 跳转到指定的目录 cd /root/fabric/fabri…

Spring Security 6.x 系列(14)—— 会话管理之会话固定攻击防护及Session共享

一、前言 在上篇 Spring Security 6.x 系列(13)—— 会话管理之会话概念及常用配置 中了清晰了协议和会话的概念,并对 Spring Security 中的常用会话配置进行了说明,今天我们着重了解会话固定攻击防护和 Session 共享,并对部分源码进行分析。 二、会话固定攻击防护 2.…

QT----Visual stdio翻金币案例,附源码

历经一个月&#xff0c;各种事情磕磕绊绊&#xff0c;终于结束了&#xff0c;自己还是太菜了 案例的文档写的教程已经很详细&#xff0c;这边主要是记录一些问题 github代码 gitee代码 1、图片无法加载 一开始加载首页图片和标题出不来&#xff0c;结果是paintEvent重写的字打…

Redis(一)

1、redis Redis是一个完全开源免费的高性能&#xff08;NOSQL&#xff09;的key-value数据库。它遵守BSD协议&#xff0c;使用ANSI C语言编写&#xff0c;并支持网络和持久化。Redis拥有极高的性能&#xff0c;每秒可以进行11万次的读取操作和8.1万次的写入操作。它支持丰富的数…

虚幻UE 材质-进阶边界混合之距离场限制PDO范围

基础边界混合那篇文章&#xff1a;虚幻UE 材质-边界混合之PDO像素深度偏移量 可以通过抖动来进行混合&#xff0c;但是有问题的点在与抖动发生的位置只需要在两物体的交界处 所以本篇文章会通过距离场限制来限制抖动的位置&#xff0c;防止其他地方发生抖动影响画面。 文章目录…

python小波变换学习

小波变换 尺度函数 &#xff1a; scaling function &#xff08;又称为父函数 father wavelet &#xff09; 小波函数 &#xff1a; wavelet function&#xff08;又称为母函数 mother wavelet&#xff09; 连续的小波变换 &#xff1a;CWT 离散的小波变换 &#xff1a;DWT 小…

详细设计文档该怎么写

详细设计文档是软件开发过程中的一个关键阶段&#xff0c;它为每个软件模块的实现提供了详细说明。这份文档通常在概要设计阶段之后编写&#xff0c;目的是指导开发人员如何具体实现软件的功能。以下是撰写详细设计文档的步骤和一些示例&#xff1a; 步骤和组成部分 引言 目的…

【IDEA——连接MySQL数据库,创建库和表】

IDEA——连接MySQL数据库&#xff0c;创建库和表 1、打开idea数据库操作页面&#xff08;两种打开方法都可以&#xff09; 2、点击加号&#xff0c;选择Driver,方便导入连接数据库的驱动jar包 然后选择MySQL进行添加驱动 3、点击上一步页面的左上方的Data Sources连接本地数据…

单细胞测序没有中性粒细胞?

建库流程需要特别注意&#xff0c;参考10x官网&#xff1a; https://www.10xgenomics.com/support/software/cell-ranger/tutorials/cr-tutorial-neutrophilshttps://kb.10xgenomics.com/hc/en-us/articles/360004024032-Can-I-process-neutrophils-or-other-granulocytes-usi…

AI:103-基于深度学习的海上牧场鱼群识别技术

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大…

组播(多播)原理及代码

单播地址标识单个 IP 接口&#xff0c;广播地址标识某个子网的所有 IP 接口&#xff0c;多播地址标识一组 IP 接口。 单播和广播是寻址方案的两个极端&#xff08;要么单个要么全部&#xff09;&#xff0c;多播则意在两者之间提供一种折中方 案。多播数据报只应该由对它感兴…