判断一个整数是否为2的幂次方法有以下几种:
1.循环除2
这是最简单最好理解的方式。对于一个数如果是2的幂次,则其肯定可以被2一直整除直到其值为1。
所以可以通过一个while循环判断:
void judge(int b)
{
while (!(b % 2))
{
b = b / 2;
if (b == 1)
{
printf("b 是 2 的幂次");
return;
}
}
printf("b 不是 2 的幂次");
return;
}
while中是一个循环除2的过程,当除2取余后余数不为零则跳出循环。此时说明该数字不是2的幂次。此时打印判断该整数不是2的幂次。
if语句用于判断该数字是否循环除2至最后一次,因为任何一个2的幂次最后一次除2都会变为1。此时打印判断该整数是2的幂次。
2.位运算判断
第一种方法循环估计可以实现想要的结果,但是效果相对而言不是那么快。第二种方式通过位运算估计。
将任意一个数转化成2进制,如果该数为2的次幂,会发现该数只有一位数是1其他数都是0。例如:
2
1
2^{1}
21=0010
2
2
2^{2}
22=0100
2
3
2^{3}
23=1000
此时,我们将该数字减一可以得到:
2
1
2^{1}
21=0010
\quad\quad\quad\quad
2
1
2^{1}
21-1=0001
2
2
2^{2}
22=0100
\quad\quad\quad\quad
2
2
2^{2}
22-1=0011
2
3
2^{3}
23=1000
\quad\quad\quad\quad
2
3
2^{3}
23-1=0111
注意到这里任何一个2的幂次数字的二进制数与其减一之后的数字相与的值都为零:
2
1
2^{1}
21=0010 &&
2
1
2^{1}
21-1=0001 = 0000
2
2
2^{2}
22=0100 &&
2
2
2^{2}
22-1=0011 = 0000
2
3
2^{3}
23=1000 &&
2
3
2^{3}
23-1=0111 = 0000
所以可以通过整数与其减一之后的数相与的方式判断一个数是否为2的次幂:
if ((a > 0) && (a & (a - 1)) == 0)
printf("a 是 2 的幂次");
else
printf("a 不是 2 的幂次");
printf("\n");
该方法比第一种方法相对更加简洁。
3.用Integer.bitCount(n)统计二进制中1的个数为1。
该方法承接思路2,如果n为2的幂次方,那么二进制位上只有一位是1。具体方法未验证,可以参看第二篇参考文献。
前两种算法总体实现代码如下:
#include<stdio.h>
int main()
{
int a;
int b;
int c;
a = 125;
b = 128;
if ((a > 0) && (a & (a - 1)) == 0)
printf("a 是 2 的幂次");
else
printf("a 不是 2 的幂次");
printf("\n");
void judge(int b);
judge(b);
}
void judge(int b)
{
while (!(b % 2))
{
b = b / 2;
if (b == 1)
{
printf("b 是 2 的幂次");
return;
}
}
printf("b 不是 2 的幂次");
return;
}
效果如下: 参考:
1、
https://blog.csdn.net/u012028275/article/details/112110757?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-1.no_search_link
2、
https://blog.csdn.net/tc979907461/article/details/106711544
3、
https://blog.csdn.net/qq_35535992/article/details/53749510?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_link
|