IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ 判断一个 int 型整数是否为 2 的 N 次方(幂次) -> 正文阅读

[C++知识库]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 \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
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-17 12:34:54  更:2021-11-17 12:35:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:55:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码