C++ 判断一个 int 型整数是否为 2 的 N 次方(幂次)

本文介绍了三种方法来判断一个整数是否为2的幂次:1) 循环除2,确保每次除以2后余数为0;2) 位运算,通过与操作检查二进制中是否只有一个1;3) 使用Integer.bitCount()统计1的个数。展示了相应的代码示例和效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

判断一个整数是否为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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶执念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值