查找整数在内存中的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 | 状态 |
---|---|
1000 | n |
0111 | n-1 |
0000 | n |
平台: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的主要内容,如果未能解决你的问题,请参考以下文章
如何使用模块化代码片段中的LeakCanary检测内存泄漏?
2021-09-11:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。反转后整数超过 32 位的有符号整数的范围就返回0,假设环境不允许存储 64 位整数(有符号或无符号)。(代码片段