统计一个数的二进制中1的个数(三种方法)

这篇具有很好参考价值的文章主要介绍了统计一个数的二进制中1的个数(三种方法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 那么好了好了,宝子们,今天给大家分享一篇经典例题的三种实现方法,来吧,开始整活!⛳️

 一、基础法

 统计一个数的二进制中1的个数(三种方法)

 

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int number_of_one(int n)
{
	int count = 0;
	while(n)
	{
		if (n % 2 == 1)
			count++;
		n =n/ 2;
	}
	return count;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = number_of_one(n);
	printf("%d\n", ret);
	return 0;
}

这个代码看似正确,但是如果你输入负数就会出现问题:

统计一个数的二进制中1的个数(三种方法)

 -1的二进制中有32个1,但是为什么是0呢?

        因为他把你当做是有符号位-1进去%2不等于1的话它就会除2÷2就等于0,就不会进入那个循环count永远是0;

        所以说方法一的改进方法是:(unsigned int 立大功)

统计一个数的二进制中1的个数(三种方法)

 

        方法一负数解决方法:-1在内存中储存的确实是补码32个1,当把-1传参后仍然是32个1,如果你把它当做是有符号的数值,它还是-1。如果你接收的数据类型是无符号位,unsigned int 那么你输入的数就不存在符号位,就没有源反补的概念,就把你输入的数当做一个很大的数,直接接收,-1(当做32个1处理)。

二、二进制内部的暗箱操作

         在这里我们直接使用关于二进制的操作符,右移操作符(>>)和 按位与操作符(&)

#include <stdio.h>
int number_of_one(int n)
{
	int i = 0;
	int count = 0;
	for (i = 0; i < 32; i++)
	{
		if ((n >> i) & 1 == 1)
			count++;
	}
	return count;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = number_of_one(n);
	printf("%d\n", ret);
	return 0;
}

        但是这样写的代码有一个弊端,无论你输入的数是多少,都会循环32次。

三、奇妙爆炸法:(n=n&(n-1))

下面是举例说明,请仔细阅读: 

 统计一个数的二进制中1的个数(三种方法)

 

#include <stdio.h>
int number_of_one(int n)
{
	int count = 0;
	while (n)
	{
		n = n & (n - 1);
		count++;
	}
	return count;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = number_of_one(n);
	printf("%d\n", ret);
	return 0;
}

        这种方法是最最简单的方法,没有之一!

这种方法大多数人都想不到,但是只要你多做题,多看题,提升自己的代码思维,我觉得应该是没问题的

好了,今天的分享就到这里了

如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!

统计一个数的二进制中1的个数(三种方法)文章来源地址https://www.toymoban.com/news/detail-454578.html

到了这里,关于统计一个数的二进制中1的个数(三种方法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言每日一题之整数求二进制1的个数

    今天分享一道题目,用三种方法来求解 二进制1的个数 方法1 我们的十进制除10和取余数就可以得到我们每一位的数字,那我们的二进制也可 以 这是一种方法,另外一种就是我们可以用移位操作符来算 这个方法是不是也是特别妙呢,当然还有更妙的方法,请看!!! 相信看

    2024年02月15日
    浏览(62)
  • C语言每日一题(5):求两个数二进制中不同位的个数

    文章主题:求两个数二进制中不同位的个数🔥 所属专栏: C语言每日一题 📗 作者简介:每天不定时更新C语言的小白一枚,记录分享自己每天的所思所想😄🎶 个人主页: [₽]的个人主页 🏄🌊 最近刚学位操作符以及二进制码的相关知识,于是想出了求两个数二进制中不同

    2024年02月07日
    浏览(152)
  • C#蓝牙连接及传输数据的三种方式(蓝牙传输文件、二进制数据)

          先下载InTheHand.Net.Personal.dll并在C#中引用,这个需要在网上下载      先看界面            这种方式优点是稳定性较强,基本无错误,就是偶尔需要提前蓝牙配对。        这种方式直接与蓝牙设备进行配对的时候会报错,请求的地址无效,这时候需要在被检测的蓝牙

    2024年02月11日
    浏览(76)
  • C#,二进制数的非0位数统计(Bits Count)的算法与源代码

    计算一个十进制数的二进制表示有多少位1? 使用循环按位统计1的个数。 利用一个数组或哈希生成一张表,存储不同二进制编码对应的值为1的二进制位数,那么在使用时,只需要去进行查询,即可在O(1)的时间复杂度内得到结果。 但是,此算法有个弊端,由于算法是采用空间

    2024年02月22日
    浏览(60)
  • python十进制转二进制方法详解

      在 Python中,十进制数可以转换成二进制数。例如: 但是,十进制数不是直接转换成二进制,而是先转换成二进制数,再转换成十进制。接下来我们来看看具体的实现方法: 首先我们来看一个例子: 上面代码中,使用了循环遍历的方法。从这个例子中我们可以发现,需要遍

    2023年04月19日
    浏览(111)
  • 二进制与十进制数互相转换的方法及原理

    有人问我一道十进制数转化为二进制数的题:13.625转化为二进制应该如何表示。让我回忆起十多年前学编程时就搞不懂二进制,不找“不必求甚解”的借口,我搜索了一些平台,但很失望,这么多年过去了,能找到的资源依然和以前一样,只讲怎样操作,不提为什么这样操作

    2024年02月04日
    浏览(73)
  • Vue前端渲染blob二进制对象图片的方法

    近期做开发,联调接口。接口返回的是一张图片,是对二进制图片处理并渲染,特此记录一下。 本文章是转载文章,原文章:Vue前端处理blob二进制对象图片的方法 接口response是下图 显然,获取到的是一堆乱码,前端需要将其解析出来,百度之后发现解析二进制文档流的写法

    2024年02月15日
    浏览(64)
  • Vue前端处理blob二进制对象图片的方法

    近期在做开发的时候遇到一个问题,前端传递一个参数,后端返回一张图片,前端再将该图片展示出来,由于是第一次处理二进制图片对象,特此记录一下。 首先,已知后端接口无误,传递参数可以正常返回图片    前端调用接口,打印并查看获取到的响应数据:     显然

    2024年02月16日
    浏览(51)
  • 【C语言】十进制(正负)与二进制(正负)互相转换的方法技巧:短除法、取反、按位乘……

    导读 :二进制数最高位为符号位,0表示正数、1表示负数 1、正数:短除法,然后将所有0、1从上到下连起来从右至左摆放,不够八位数的左边补0 【例】将十进制数60、13转为二进制: 2 | 60 ‾ underline{text{60}} 60 ​                               2 | 13 ‾ underl

    2023年04月10日
    浏览(59)
  • 拷贝音频、视频、word等二进制文件的实现方法,不掉帧

    拷贝音频、视频、word等二进制文件的实现方法:  演示使用BufferedOutputStream 和 BufferedInputStream 使用  使用他们,可以完成二进制文件  思考:字节流可以操作二进制文件,可以操作文本文件吗?True

    2024年02月07日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包