栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

判断一个整数是否为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 quadquadquadquad 2 1 2^{1} 21-1=0001
2 2 2^{2} 22=0100 quadquadquadquad 2 2 2^{2} 22-1=0011
2 3 2^{3} 23=1000 quadquadquadquad 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
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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/511193.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号