求一个整数二进制中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.hqwc.cn/news/318562.html

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

相关文章

MySQL中的事务到底是怎么一回事儿

简单来说&#xff0c;事务就是要保证一组数据库操作&#xff0c;要么全部成功&#xff0c;要么全部失败。在MySQL中&#xff0c;事务支持是在引擎层实现的&#xff0c;但并不是所有的引擎都支持事务&#xff0c;如MyISAM引擎就不支持事务&#xff0c;这也是MyISAM被InnoDB取代的…

【日积月累】Java Lambda 表达式

目录 【日积月累】Java Lambda 表达式 1.前言2.语法3.应用场景3.1简化匿名内部类的编写3.1简化匿名内部类的编写3.2简化集合类中的操作3.3实现函数式接口3.4简化多个方法的调用3.5简化异步编程 4.总结5.参考 文章所属专区 日积月累 1.前言 Lambda表达式是一个匿名函数&#…

QGIS设计导出Geoserver服务使用的SLD样式

1、打开QGis软件 2、打开shp文件所在所在文件夹&#xff0c;双击添加选中图层 3、编辑shp文件样式 &#xff08;1&#xff09;双击“Layers”中需要编辑的图层 &#xff08;2&#xff09;选择样式 &#xff08;3&#xff09;编辑样式后&#xff0c;选择“应用”—》“确定” 4…

【LeetCode】每日一题 2023_12_31 一年中的第几天(日期)

文章目录 随便聊聊时间题目&#xff1a;一年中的第几天题目描述代码与解题思路 随便聊聊时间 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 12 月的打卡勋章&#xff0c;get&#xff01; 题目&#xff1a;一年中的第几天 题目链接&#xff1a;1154. 一年中…

Docker安装MySQL(OpenWRT)

参考文章&#xff1a; Docker安装MySQL&#xff08;含open | D-y Blog 第一步、拉取镜像 docker pull mysql:5.7docker pull mysql:latest 安装你的需求去安装版本 第二步、docker代码 docker run -d --name mysql -p 3306:3306 --privilegedtrue -v /usr/local/mysql/lo…

成为一名合格的前端架构师,前端知识技能与项目实战教学

一、教程描述 本套前端架构师教程&#xff0c;大小35.94G&#xff0c;共有672个文件。 二、教程目录 01.node介绍和环境配置&#xff08;共6课时&#xff09; 02.ES6语法&#xff08;共5课时&#xff09; 03.node基础&#xff08;共29课时&#xff09; 04.Express框架&am…

Node.js+Express 获取前端get请求参数值

前端请求&#xff1a; http://localhost:3002/api/user/login?username002&password002 后端响应 router.get(/api/user/login, (req, res) > {let username req.query.username;let password req.query.password;const sqlStr SELECT * FROM sys_user where use…

船舶数据采集与分析在线能源监测解决方案

一、船舶在线能源监测应用前景 船舶在线能源监测在能源效率优化、故障诊断和预测维护、节能减排和环保监管、数据分析和决策支持以及自动化智能化等方面具有广阔的应用前景。随着船舶行业对能源管理和环保要求的不断提高&#xff0c;船舶在线能源监测技术将成为船舶运营和管理中…

不会写好你的年终总结报告,约等于一年白干,老板看了都摇头!

2023 年即将接近尾声&#xff0c;各大公司的“测试媛/猿”们又到了提交年终总结报告的时候了。 每年到这个时候都是抓耳挠腮、冥思苦想的时候&#xff0c;猛然一想&#xff0c;今年跟去年做的事情好像差不多&#xff0c;那么年终总结可以敷衍了事么&#xff1f; 前言 当然是不…

【数据结构】二叉树(一)——树和二叉树的概念及结构

前言: 本篇博客主要了解什么是树&#xff0c;什么是二叉树&#xff0c;以及他们的概念和结构。 文章目录 一、树的概念及结构1.1 树的基本概念1.2 树的相关特征1.3 树的实现 二、二叉树的概念及性质2.1 二叉树的概念2.2 二叉树的性质 一、树的概念及结构 1.1 树的基本概念 树&…

【LeetCode 面试经典150题】42. Trapping Rain Water 接雨水

42. Trapping Rain Water 题目大意 Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it can trap after raining. 中文释义 给定 n 个非负整数&#xff0c;代表以宽度为 1 的条形图的高程图&…

golang并发编程-channel

在golang 并发编程里&#xff0c;经常会听到一句话&#xff1a;不要通过共享内存进行通信&#xff0c;通过通信来共享内存。下面我们会介绍下channel, 通过源码的方式去了解channel是怎么工作的。 基本结构 流程图 代码解读 type hchan struct {qcount uint // …