查找整数在内存中的1

Posted 跳动的bit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找整数在内存中的1相关的知识,希望对你有一定的参考价值。

/***********************************************************************
目的:统计一个整数的二进制补码中的有几个1
分析:
▶ 对于一个十进制整数要得到它的每一位十进制数需要不断的 %10 和 /10

▶ 对于一个十进制整数要得到它的每一位二进制数(补码)需要不断的 %2 和 /2
在这里插入图片描述

平台:Visual studio 2017 && windows
*************************************************************************/
📝 实现代码Numberof1:

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

❓❔ Numberof1能否统计负整数二进制中的1
📐 验证如下:
在这里插入图片描述


/***********************************************************************
目的:解决Numberof1函数不能统计负整数二进制中的1的问题
分析:
▶ 方法1,在传参的时候,形参的类型使用unsigned int来接收即可
▶ 方法2,使用按位与操作符 ‘&’
平台:Visual studio 2017 && windows

*************************************************************************/
📝 实现代码Numberof2:

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

📝 实现代码Numberof3:

#include<stdio.h>
int Numberof3(int n)
{
	int count = 0;//统计
	//while循环的方法:
	/*
	int twice = 32;//循环次数
	while(twice)
	{
		if(n & 1 == 1)
		{
			count++;
		}
		n >>= 1;
		twice--;
	}
	*/

	//for循环的方法:
	int i = 0;
	for(i = 0; i < 32; i++)
	{
		if(((n >> i) & 1) == 1)
		{
			count++;
		}	
	}
	return count;
}
int main()
{
	int n = -1;
	int ret = Numberof3(n);
	printf("%d\\n", ret);
	return 0;
}

❓❔ 看到这里,还可以优化或者有更好的写法吗,要的就是那种高大上的感觉
注:纯属为了装B😎

在这里插入图片描述
在这里插入图片描述


/***********************************************************************
目的:优化Numberof3代码
分析:n = n & (n - 1)
每次&都会去掉一个1(其实不难理解:只要有1,那么1 & 1-1则为0,直到全为0)
在这里插入图片描述

平台:Visual studio 2017 && windows

*************************************************************************/
📝 实现代码Numberof4:

#include<stdio.h>
int Numberof4(int n)
{
	int count = 0;
	while(n)
	{
		n = n & (n - 1);
		count++;
	}
	return count;
}
int main()
{
	int n = -1;
	int ret = Numberof4(n);
	printf("%d\\n", ret);
	return 0;
}

在这里插入图片描述


🧿 拓展
/***********************************************************************
目的:写一个代码判断一个数字是不是2的n次方(n为正数)
分析:2的n次方数字,其补码只有一个1
▶ 我们当然可以去套用上面的Numberof4,但是这样就把代码复杂化了
▶ 只要n & (n - 1) == 0,n就是2的n次方

n = 8状态
1000n
0111n-1
0000n

平台:Visual studio 2017 && windows
*************************************************************************/
📝 实现代码Numberof5:

#include<stdio.h>
int Numberof5(int n)
{
	if((n & (n - 1)) == 0)
	{
		return 1;	
	}
	return 0;
}
int main()
{
	int n = 8;
	//Numberof5这个函数如果返回1,表示这个数是2的n次方;否则不是
	int ret = Numberof5(n);
	if(1 == ret)
	{
		printf("Yes\\n");
	}
	else
	{
		printf("No\\n");	
	}
	return 0;
}

以上是关于查找整数在内存中的1的主要内容,如果未能解决你的问题,请参考以下文章

C 中的共享内存代码片段

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

以下代码片段的时间复杂度是多少?

2021-09-11:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。反转后整数超过 32 位的有符号整数的范围就返回0,假设环境不允许存储 64 位整数(有符号或无符号)。(代码片段

使用 4 mb 查找不在 40 亿列表中的整数。但是4 MB是不够的[重复]

编写代码,求一个整数在内存中的二进制中1的个数