java判断2的n次方_判断一个正整数是否是2的N次方的简洁算法及其证明

news/2024/11/17 1:50:46/

在写代码时遇到了“判断一个正整数是否是2的N次方”的问题,不想调用 java.lang 的 Math 类库进行浮点运算,觉得转换为浮点不是个好办法。

遂在网上搜索了一下,发现有人列出来好几种写法,列举几种:

1、通过循环除2;这种方法不值一提,略过;

2、针对32位/64位只有有限个 2 的N次方的常量值,逐个进行比较;额。。。这个也略过;

3、通过正则表达式进行文本匹配,判断是否2的后面都是 0 ;这个绕得更远了。。。

最后,有一种最简洁优雅的写法:(value & (value -1)) == 0;

喔,的确是简洁优雅!!!

不过,等等,接下来有人提出,似乎“所有2的N次方的结果都符合这个表达式”这点很容易证明;

可是如何证明符合条件“(value & (value -1)) == 0”的一定就是 2 的 N 次方呢?(N 是整数且大于等于0)。

想了一下,证明也不难,遂在此记下:

1、首先,记 A = value; B = value - 1;

2、既然 A & B == 0,那么意味着,A和B的二进制形式中,每一位都不相同;(例外的情况只有“两者都是 0” ,否则存在相同位的两个数的按位相与的结果不可能为 0)

3、由于 B = A - 1,即  A > B;基于第2点,A 和 B 每一位都不同,则可以推断出只有两种情况:

(1)以二进制形式, A 最高位 1 与 B 的最高位 1 的位数相差 1 ;(x表示后面跟随的位数是 0 位到多位)

A: 10xxxxxxx

B: 01xxxxxxx

(2)第二种情况就是:A = 1,B = 0;

显然第二种情况是符合命题的,因为 N = 0 ,2 的 N 次方的结果为 1 ; 接下来继续针对第一种情况做推导。

4、由于 A 与 B 仅相差1,那意味着在 B 的二进制的末尾加上 1 ,将会连续地向高位产生进位,最终导致 B 的最高位 01 进位为 10 ;

注意,二进制形式中,能够“连续向高位产生进位”的情况只有一种,即 xxxxxxx 全部都是 1 ,也就是说 B 的全部是 1 ;

由此,基于第2点,A 和 B 的每一位都不同,那么 A 除了最高位 1 之外,所有低位都是 0 ;

由此证得命题!


http://www.ppmy.cn/news/720579.html

相关文章

c语言2的n次方编程利用数组,1.6编程基础之一维数组_12计算2的N次方

1.6编程基础之一维数组_12计算2的N次方 总时间限制: 1000ms 内存限制: 65536kB 描述 任意给定一个正整数N(N<100)&#xff0c;计算2的n次方的值。 输入 输入一个正整数N。 输出 输出2的N次方的值。 样例输入 5 样例输出 32 提示 高精度计算 # include using namespace std; …

怎么用c语言编写2的n次方,2的n次方用C语言怎么编写程序

#include double f(double x,int n); main() { double x; int n; printf("please input x & n:"); scanf("%lf,%d",&x,&n); if(x0) { if(n>0) printf("\n\n0.000000...... 已知28的n次方16的n次方2的22次方&#xff0c;求n的值 28的n次…

c语言2的63次方怎么编译,C语言求等比数列2的0次方,2的1次方,2的2次方,...,2的63次方前64项的和....

优质解答 给你提供三种方法,你自己根据其优劣进行选择. #include #define N 64 /*方法一*/ unsigned _int64 fun_1( ) { unsigned _int64 sum 0,item 1; int i; for(i 0; i < N; i) { sum item; item * 2; } return sum; } /*方法二*/ unsigned _int64 fun_2( ) { unsig…

2的64次方输出C语言,c语言中2的32次方是什么数据类型?

是整形。一般占4个字节(32位)&#xff0c;最高位代表符号&#xff0c;0表示正数&#xff0c;1表示负在内存中的存储顺序是地位在前、高位在后&#xff0c;例如0x12345678在内存中的存储如下&#xff1a; 地址&#xff1a;0x0012ff78 0x0012ff79 0x0012ff7a 0x0012ff7b 数据&…

2的20次方怎么用计算机计算,2的20次方(2的20次方简便方法)

请详细说明,谢谢 2的10次方=1024 所以2的20次方等于1024*1024=1048576 4个字节能表示的最大整数是2^31-1.在上述中2^31-1表式2的31次方减1.字节(Byte)是计算机信息技术用于计量存储容量和传输容量的一种计量单位,1个字节等于8位二. 2^20=4^10=16^5=256*256*16=1048576 2的20次…

通过例子进阶学习C++(四)计算2的64次方,不服写写看

本文是通过例子学习C的第四篇&#xff0c;通过这个例子可以快速入门c相关的语法。 1.乍一看题目非常简单&#xff0c;简单思考一下&#xff0c;可以通过for循环实现&#xff1a; #include <iostream> using namespace std; int main() {int num 1;for(int i0;i<64;…

基于ava+Swing+Mysql图书信息管理系统

基于JavaSwingMysql图书信息管理系统 一、系统介绍二、功能展示1.主页2.新增图书信息3.删除图书信息 三、数据库四、其他系统实现五、获取源码 一、系统介绍 该系统实现了查看图书列表、新增图书信息、删除图书信息 运行环境&#xff1a;eclipse、idea、jdk1.8 二、功能展示…

sim卡在苹果手机显示无服务器,iPhone手机没有信号怎么办 手机提示无服务怎么解决...

如果您在 iPhone 或 iPad(Wi-Fi 蜂窝网络)上看到“无服务”或“正在搜索”&#xff0c;或者无法连接到蜂窝网络或蜂窝数据&#xff0c;请按照以下步骤操作&#xff1a; 手机提示无服务怎么解决? 检查覆盖区域 请确保您在蜂窝网络的覆盖区域内。然后&#xff0c;按照以下步骤操…