这个问题可能很多面试的人都遇到过,很多人可能想利用循环来判断,代码可能如下所示: public static boolean isPowOfTwo(int n) {

int temp = 0;

for (int i = 1; ; i++) {

temp = (int) Math.pow(2, i);

if (temp >= n)

break;

}

if (temp == n) return true;

else return false;

}

上面的代码简单明了。但是,这样的方案效率比较低。我们仔细分析一下,正整数是2的n次幂他有什么规律?20=1,21=2,22=4,23=8....这样看是没有什么规律的。但是如果将2的幂次方写成二进制形式后,很容易就会发现有以下两个特点:

1、20=1 -> 0001,21=2 -> 0010,22=4 ->  0100,23=8  -> 1000二进制中只有一个1,并且1后面跟了n个0。

2、如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1;因此将原来的数与去减去1后的数字进行与运算后会发现为零((x & x- 1) == 0)。

原因:因为2n换算是二进制为10……0这样的形式,2n-1的二进制为0111...1,两个二进制求与结果为0,例如:16的二进制为10000;15=01111,两者相与的结果为0。计算如下:

10000

&01111

-------

00000

所以可以用下面 public static boolean isPowerOfTwo(int x) {

return x > 0 & (x & (x - 1)) == 0;

}

很简单的一行代码就实现了。细心的读者可能会问:2的n次幂二进制始终都是只有一个1,其它的位数都为0,是否可以判断给定的数转换为二进制来判断其中是否只有1个1来得出给定数是否为2的n次幂呢?答案是不能。因为Integer.MIN_VALUE的二进制只有1个1,但是Integer.MIN_VALUE并不是2的n次幂,所以不能用上面方式来实现。(完)

matlab获取2的整数次幂,如何快速判断正整数是2的N次幂相关推荐

  1. C语言编程判断是否为2的幂,C语言判断一个数是否是2的幂次方或4的幂次方

    快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0: 因此问题可以转化为判断1后面是否跟了n个 ...

  2. 快速判断一个数是否是4的幂次方,若是,并判断出来是多少次方! .

    将4的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1(1在奇数位置),并且1后面跟了偶数个0: 因此问题可以转化为判断1后面是否跟了偶数个0就可以了. 4的整数次幂的二进制数都为 ...

  3. 快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!

    将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0: 因此问题可以转化为判断1后面是否跟了n个0就可以了. 如果将这个数减去1后会发现,仅有的那个1会变为 ...

  4. 快速判断一个数是否是2的幂次方

    public class Test {public static void main(String[] args) {int num = 10;if (0 == (num & (num - 1 ...

  5. C语言判断是不是2的幂次方,C语言判断一个数是否是2的幂次方或4的幂次方

    快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方! 将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0: 因此问题可以转化为判断1后面是否跟了n ...

  6. matlab获取等高线的坐标,[matlab数据拟合曲线]matlab获取等高线的数据

    篇一 : matlab获取等高线的数据 contour(X,Y,Z,v)画出Z在向量v所有值处的等高线,如只想画出Z在i处的等高线,则调用contour(X,Y,Z,[i,i]).如果没有图形,可以将 ...

  7. matlab获取目录中图像名称及路径的递归实现

    一个matlab获取目录中图像名称及路径的递归实现~ matlab源文件 getImageList.m [c-sharp] view plaincopyprint? function [ imageL ...

  8. MATLAB获取屏幕分辨率

    1. 获取分辨率 本来设计程序按照1920x1080运行的,后面调了一下系统缩放,分辨率就变了,所以为了更灵活的使用,还是先获取再使用吧 matlab获取屏幕分辨率命令: get(0,'ScreenS ...

  9. MATLAB colorbar颜色红黄绿,Matlab获取colorbar颜色并转换为需要的CPT文件

    问题:如何把图片的colorbar颜色转换为需要的CPT文件 参考Matlab获取文献中的colorbar 解决: (1)将colorbar截图存储成jpg或png格式文件. (2)在Matlab中: ...

最新文章

  1. c++switch实现猜拳_策略模式+简单工厂+注解消除 if-else/switch-case
  2. 微信小程序签名(横屏+竖屏)
  3. CF #737(div2) Ezzat and Two Subsequences 找规律
  4. Java中的List/Set和Map的区别
  5. mongodb java数组_MongoDB 基础java数据类型
  6. 深度学习(七十)darknet 实现编写mobilenet源码
  7. Oracle 各种语法(一)
  8. oxp开放型可变长协议_培养开放型领导者
  9. 点击APPicon之后都发生了什么
  10. spring整合ehcache
  11. java并发编程入门_Java并发编程从入门到精通 PDF 下载
  12. linux强制安装deb,ubuntu强行修改deb安装包依赖
  13. tensorflow2.X tf.data.Dataset详解
  14. SQLite管理软件 - SQLiteSpy
  15. 比微信还方便,一键导出你与 ChatGPT 的聊天记录,而且是 Markdown 格式!
  16. 嵌入式实时操作系统11——操作系统内核运行原理
  17. 人生六十才开始(转载)
  18. React 性能优化完全指南,将自己这几年的心血总结成这篇!
  19. abaqus算界面脱粘_ABAQUS粘聚力模型( Cohesive Model ) 应用小结
  20. 基于eclipse的android项目实战—博学谷(五)“我”的模块

热门文章

  1. 关于java 操作word的几种方式
  2. vue 移动端校验(是否移动设备,安卓/IOS,是否微信浏览器)
  3. php扒皮,扒皮b站美妆up主兰花
  4. 09.CSS3渐变、过渡、转换、动画
  5. android 图片编辑工具,图片编辑工具手机版下载
  6. Kubernetes集群部署篇( 一)
  7. SpringBoot-logback配置输出Json格式日志
  8. Word无法插入页码怎么办?Word页码选项变灰,无法使用解决方法
  9. 产品经理如何做好需求调研
  10. 【12月原创】RT-thread - 柿饼UI学习心得分享