注意:不用求K是多少,只需要判断,请编写函数实现。
核心思想:按位与(&), n = m & (m - 1);
考虑2的k次方数的特点,每一个2的k次方数转化为2进制之后,只有一位为1,我们只需要判断二进制位上是不是只有一个1
用m&(m - 1)就是在消除二进制位上的1,由于二进制位只有一个1, 所以 n = 0.
#include<stdio.h>
#include<stdlib.h>
int IsPow(int m)
{
if (m < 1)
return 0;
int n = m&(m - 1);
return n == 0;//n==0是判断表达式,该表达式返回的是 真假,
//因此return n == 0;就是先判断n 是否等于0,若等于则返回真(1),否则返回假(0)
}
int main()
{
int m, k;
printf("请输入一个整数m:\n");
scanf("%d", &m);
if (IsPow(m))
{
printf("%d是2的K次方\n", m);
}
else
{
printf("%d不是2的K次方\n", m);
}
system("pause");
return 0;
}
本文介绍了一种通过按位与操作判断一个数是否为2的幂次方的算法。利用二进制中2的幂次方数的特性,即只有单一的1位,通过m&(m-1)的操作来消除二进制中的1,如果结果为0,则说明输入的数m是2的幂次方。
948

被折叠的 条评论
为什么被折叠?



