题目:给定一个整数num,判断这个整数是否是2的N次方。比如,2,4,8是2的那次方,6,10不是2的N次方。

请看下面的程序:

public static bool Check1(int num)

{

int i = 1;

while (true)

{

if (i > num)

return false;

if (i == num)

return true;

i = i * 2;

}

}

不断的循环num%2,如果不等于0,return false,如果等于0,num=num/2,一直做到num=1

public static bool Check2(int num)

{

if (num == 1)

return true;

else

{

do

{

if (num % 2 == 0)

num = num / 2;

else

return false;

}

while (num != 1);

return true;

}

}

其实这两种算法的思路都是相同的,但是第二种相对第一种更高效写,因为如果不是2的N次方,可以少循环很多次!

由于2的N次方的数二进制表示是第1位为1,其余为0,而x-1(假如x为2的N次方)得到的数的二进制表示恰恰是第1位为0,其余为1,两者相与,得到的结果就为0,否则结果肯定不为0。

public static boolean getResult(int num)

{

if (num <= 1)

{

return false;

}

else

{

return ((num & (num - 1)) == 0) ? true : false;

}

}

public static void main(String[] args) {

System.out.println(getResult(32));

}

上面的程序多判断了一个1. 我们知道, 1是2的0次方。 1应该是符合要求的。下面修正:

public static bool floor_7(int num)

{

if (num < 1)

{

return false;

}

else

{

return ((num & (num - 1)) == 0) ? true : false;

}

}

如果一个数是2的整数次幂,那么表示为二进制的时候会是这样:010000....

除了2的零次方,即1之外,这个数减一会得到:001111....

换言之得到一个前面全是0后面全是1的数,把这个数和原数做个按位与,得到:000000.....

换言之,如果一个数n,其不为1,且n-1 & n = 0,那么n就是一个2的整数次幂。因为只要他表达为二进制时存在两个1,就不会满足这条规律。所以最简判断方法就是:

if ( n < 0 )

throw new InvalidOperationException();

if ( n < 2 )

return false;

return n & ( n - 1 ) == 0

修正之后:

public bool floor_8(int n)

{

if (n < 0)

throw new InvalidOperationException();

if (n < 2)

return false;

return n & (n - 1) == 0;

}

对数算法:

bool foo(int x)

{

float ret = log(x)/log(2);

return abs((int) ret - ret) <= 0.00001;

}

修正后:

public bool floor_22(int x)

{

float ret = log(x) / log(2);

return abs((int)ret - ret) <= 0.00001;

}

对数算法比较有趣, 可惜, 浮点误差毕竟不是个容易避开的问题。因为浮点数不能直接比较, 所以用了一个0.00001来做尺度。这就存在了一个问题:当x很大的时候呢?我找了一个变态的数字来测试:0x10000001

结果是true。因为结果的小数部分实在是太小了。

static void Main(string[] args)

{

int i = int.Parse(Console.ReadLine());

Console.WriteLine(IsCheck(i));

}

public static bool IsCheck(int num)

{

double result = Math.Log(num, 2);

if (result.ToString().IndexOf(".") >= 0)

{

return false;

}

else

{

return true;

}

}

相同的问题。 只要使用了LOG, 就无法避免掉浮点数丢精度的问题。 这是没办法的事情。

public static bool floor_37(int num)

{

double result = Math.Log(num, 2);

if (result.ToString().IndexOf(".") >= 0)

{

return false;

}

else

{

return true;

}

}

所以总结了下, (x)&(x-1)的算法还没有被证明, 不知道除了0还有没有别的反例。因为毕竟这个算式没有严密的证明过程。

因此我觉得, 最保险的还是位运算, 看多少个1, 来的最实在。当然这里存在一个负数的问题。第一位是1, 剩下全是0的问题。 不过有一位聪明的回复者提供了一个很强大的方法来避开负数的用例:他给参数定的类型是uint!

推荐:http://www.nowamagic.net/librarys/veda/detail/1031

判断一个数2的n次幂的php,如何判断一个数是不是2的n次幂相关推荐

  1. java判断两个数互质_AcWing 458. 比例简化-java(无需判断互质)

    因为数据范围很小,这道题的基本思路就是枚举所有的A'和B',找出最小的那个. 枚举需要满足下面两个条件 1.A'和B'互质 2.A'/B'的比例大于等于原来的比例,并且尽可能接近. 其实这里无需判断A ...

  2. Description 输入3个数,代表三角形的三条边长,判断这三条边是否能构成三角形,如果能, 计算并输出三角形的面积,否则输出NO。 Input 输入包括多组测试数据,每组有三个数,中间用空格隔开

    /*Description 输入3个数,代表三角形的三条边长,判断这三条边是否能构成三角形,如果能, 计算并输出三角形的面积,否则输出NO. Input 输入包括多组测试数据,每组有三个数,中间用空格 ...

  3. 判断玫瑰花数c语言程序设计教程课后答案,编写程序判断某个四位整数是否为玫瑰花数(用自定义函数)...

    用C语言编写判断输入的某个数m是否为素数 //判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是不是素数!#include#includemain(){i ...

  4. 如何用计算机算分数指数幂,第三章冪函数指数函数及其图像3.1指数和幂概念的推广.doc...

    第三章冪函数指数函数及其图像3.1指数和幂概念的推广 第三章 幂函数 指数函数及其图像 在第一章我们学习了用计算器求诸如an,的数值,也就是说,至今我们所接触的数的运算,还仅限于+,-,?,?四则运算 ...

  5. Java实现算法应用--素数 素数定义:如果一个数只能被1和它本身整除,那么这个数就是素数。

    Java实现算法应用–素数 @author asus 素数定义:如果一个数只能被1和它本身整除,那么这个数就是素数. 具体代码如下: package package6;import java.util ...

  6. ACMNO.37 C语言-数字交换 输入10个整数,将其中最小的数与第一个数对换,然后把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。

    题目描述 输入10个整数,将其中最小的数与第一个数对换,然后把最大的数与最后一个数对换. 写三个函数: ①输入10个数:②进行处理:③输出10个数. 输入 10个整数 输出 整理后的十个数,每个数后跟 ...

  7. R语言构建xgboost模型:xgb.cv函数交叉验证确定模型的最优子树个数(可视化交叉验证对数损失函数与xgboost模型子树个数的关系)、交叉验证获取最优子树之后构建最优xgboost模型

    R语言构建xgboost模型:xgb.cv函数交叉验证确定模型的最优子树个数(可视化交叉验证对数损失函数与xgboost模型子树个数的关系).交叉验证获取最优子树之后构建最优xgboost模型 目录

  8. 如何判断序列是不是堆_备胎是什么意思?如何判断自己是不是感情中的备胎?...

    一提到备胎,很多人自然的就把这个词和屌丝联系到了一起,觉得备胎就是一些女神的备用选择,但其实,这样的说法过于片面了,那备胎到底是什么意思呢? 一.备胎是什么意思 备胎一般有两种意思: 第一种意思是指汽 ...

  9. PHP使用Switch语句判断星座,PHP的switch判断语句的“高级”用法详解 用switch语句怎样判断成绩的等级...

    php switch case 求具体详解,case里面能加if语句? swich 语句 我非常喜欢用 case里面加if干嘛 . php switch中能加if语句吗 PHP里 switch cas ...

  10. java 寻找和为定值的多个数_算法笔记_037:寻找和为定值的两个数(Java)

    1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即可.例如,如果输入数组[1,2,4,5,7,11,15]和 ...

最新文章

  1. 深度学习基础:张量运算
  2. matlab中实时脚本与纯代码脚本
  3. 一道vector实现字典的题目 C++
  4. 什么是SAP Intelligent Robitic Process Automation - iRPA
  5. Vue 3.2 发布了,那尤雨溪是怎么发布 Vue.js 的?
  6. [C++]试一试结构体struct node的构造函数
  7. 使用anaconda切换Python环境使用spyder
  8. orcadcapture安装_OrCad Capture
  9. PMP课程笔记:第4章 项目整合管理
  10. 神经网络模型的实际案例,神经网络模型应用实例
  11. 汇编语言中sbb是什么意思_汇编语言里 sub是 什么功能?
  12. C#中Chart控件的一些由浅至深的理解
  13. Nginx介绍及原理简单分析
  14. nginx正向代理服务器搭建
  15. 信息系统项目管理-立项管理
  16. python--numpy模块、spicy模块、 matplotlib模块
  17. wwj jnlp配置
  18. python把文字矢量化_如何将点阵汉字矢量化 | indienova
  19. 几何向量:空间三角形外心和法向量
  20. Python 基础知识(夯实基础,才能盖起高楼大厦)

热门文章

  1. Tushare积分不够2000利用日线行情数据计算涨跌停价格
  2. 胡新宇之逝:论坛网友回复其女友之感言(转贴)
  3. IOS证书申请、上传包管理教程(appuploader)
  4. 【BZOJ 2716】天使玩偶
  5. error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 解决方法
  6. lsof |grep delete卡住_这个小区消防问题多多,物业称:设施申购手续卡住,近期将整改...
  7. 学计算机编程用苹果笔记本好么,苹果macbook好不好啊,想我想学编程用这电脑好不好,听别人说可能会不好用,是真的么...
  8. mongoose httpserver restful web
  9. 实验吧web-易-拐弯抹角(url伪静态)
  10. D. DZY Loves Modification