文章目录

  • 写在前面:
  • 方式一:用while循环反复除
    • 这种方式肯定是最好想到的,反复除,判断余数是否为零。
  • 方式二:用while循环反复乘
    • 反复乘,大了返回false,小了继续乘,等于就true。
  • 方式三:(x != 0) && ((x & -x) == x);
    • 原码,反码,补码。
    • 了解了这些,我们可以看一下这段代码(x != 0) && ((x & -x) == x);是什么含义
      • a.首先我们判断x是否为0,为0直接返回false
      • b.我们还是拿8来说
      • c.拿7看就不成立了
  • 方式四:((x != 0) && ((x & x - 1) == 0));
    • 这个和上面的方式异曲同工
  • 测试效率
  • 我最想说的是(等下我是不是跑题了,滑稽.jpg)
  • 总结:

写在前面:

关于求2的n次方问题一直是一个比较基础,但是常常拿来考察的问题,下面我列举了4种方法来判断2的n次幂,并简单测一下各种方法的效率。今天咱们就来好好扒一扒这2的n次方判断问题。

方式一:用while循环反复除

这种方式肯定是最好想到的,反复除,判断余数是否为零。

    public static boolean check2(int x) {if (x < 1) {return false;}int xx = x;//定义xx保存x的值,后面用来判断余数是否为零while (x >= 2) {xx = x;x = x / 2;if (xx - x * 2 != 0) {return false;}}return true;}

方式二:用while循环反复乘

反复乘,大了返回false,小了继续乘,等于就true。

   public static boolean check3(int x) {int flag = 1;//被乘的初始值设置为1while (true) {if (flag < x) {//小了继续乘flag *= 2;} else if (flag == x) {//等于就truereturn true;} else {//大了返回falsereturn false;}}}

方式三:(x != 0) && ((x & -x) == x);

原码,反码,补码。

首先我们要了解一下什么是原码,反码,补码。
      打个比方,拿8来说,求一下他的4位二进制

原码:正数符号位为0,数值化为2进制

反码:符号位不变,数值位取反

补码:原码符号位置不变,数值位取反末位加一或者是反码直接末位加一(电脑中的数值运算都是用补码表示)

了解了这些,我们可以看一下这段代码(x != 0) && ((x & -x) == x);是什么含义

a.首先我们判断x是否为0,为0直接返回false

  public static boolean check1(int x) {return (x != 0) && ((x & -x) == x);}

b.我们还是拿8来说

      我们可以看到8的补码和-8的补码进行&运算(同一为一),得到的结果刚好就是8的本身。即(x & -x) == x。

      而且我们可以看到,当判断的x为-8时相&的结论是与-8本身不一样的,这就很好的减少了我们判断负数的工作

c.拿7看就不成立了

方式四:((x != 0) && ((x & x - 1) == 0));

这个和上面的方式异曲同工

测试效率

 public static void main(String[] args) {long timeA1 = System.currentTimeMillis();for (int i = 0; i < 10000000; i++) {if (check2(i)) {System.out.print(i);}}long timeA2 = System.currentTimeMillis();System.out.println("方式一:" + (timeA2 - timeA1));long timeB1 = System.currentTimeMillis();for (int i = 0; i < 10000000; i++) {if (check3(i)) {System.out.print(i);}}long timeB2 = System.currentTimeMillis();System.out.println("方式二:" + (timeB2 - timeB1));long timeC1 = System.currentTimeMillis();for (int i = 0; i < 10000000; i++) {if (check1(i)) {System.out.print(i);}}long timeC2 = System.currentTimeMillis();System.out.println("方式三:" + (timeC2 - timeC1));long timeD1 = System.currentTimeMillis();for (int i = 0; i < 10000000; i++) {if (check11(i)) {System.out.print(i);}}long timeD2 = System.currentTimeMillis();System.out.println("方式四:" + (timeD2 - timeD1));}

基本上来说方式三,四的执行效率差不多,大约都是方式一的三到四倍,方式二的七到八倍。

我最想说的是(等下我是不是跑题了,滑稽.jpg)

      在计算机的设计中是只有加法器没有减法器的,因为其实减法都是可以用加法来实现的,如同7-3=4可以写成7+(-3)=4,这就减少了计算机还要设计减法器的麻烦。而为了计算机实现的简便,就出现了补码的概念。举个例子

可以看到使用补码相加直接得到了0 0100,转换成十进制就是4,对计算机来说这就很方便了,减少了设计减法器,感觉干掉了一半的工作量。

总结:

      要是再次面对这个问题时,可以和面试官含情脉脉娓娓道来,一个2的n次方聊上十几二十分钟也不是不可以!滑稽.jpg。毕竟基础的东西还是很重要的,这种问题往往能反映出一个人的基础是否扎实

如果喜欢或者对你有帮助,老铁记得点个赞哦。

如何判断2的n次方?用四种方式来扒一扒。相关推荐

  1. Java 判断字符串是否为空的四种方法、优缺点与注意事项

    以下是Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: ...

  2. java enum判断_Java Enum枚举 遍历判断 四种方式(包括 Lambda 表达式过滤)

    packagecom.miracle.luna.lambda;importjava.util.Arrays;/*** @Author Miracle Luna * @Date 2019/6/9 23: ...

  3. java字符串为空抛出异常_Java 判断字符串是否为空的四种方法,及效率比较。

    以下是Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: ...

  4. 判断无向图是否有回路有四种方法

     一.无向图回路的判断 对于无向图,判断其是否有回路有四种方法,如下所示: 1.利用深度优先搜索DFS,在搜索过程中判断是否会出现后向边(DFS中,连接顶点u到它的某一祖先顶点v的边),即在DFS ...

  5. java并发编程基础系列(五): 创建线程的四种方式

    线程的创建一共有四种方式: 继承于Thread类,重写run()方法: 实现Runable接口,实现里面的run()方法: 使用 FutureTask 实现有返回结果的线程 使用ExecutorSer ...

  6. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

  7. stream去重_重复数据如何处理?List集合去重的四种方式

    List集合在Java日常开发中是必不可少的,只要懂得运用各种各样的方法就可以大大提高我们开发的效率,适当活用各种方法才会使我们开发事半功倍.但是,有时候难免会遇到集合里的数据是重复的,需要进行去除. ...

  8. 控制器中接收数据的四种方式

    控制器中接收数据的四种方式: (仅限于个别的方式(get/post)有效) 通过形参的方式接收表单提交的数据(可以接收post与get提交的数据): 注释: GetData自己定义的方法名里面存入形参 ...

  9. C++文件读取的四种方式

    C++可以根据不同的目的来选取文件的读取方式,目前为止学习了C++中的四种文件读取方式. C++文件读取的一般步骤: 1.包含头文件 #include<fstream> 2.创建流对象:i ...

  10. Unity游戏存档的四种方式

    [转载]http://blog.csdn.net/a237653639/article/details/50076755 游戏存档 在Unity中游戏存档有如下四种方式: PlayerPrefs c# ...

最新文章

  1. 独家 | 2020年22个广泛使用的数据科学与机器学习工具(附链接)
  2. 【Android 应用开发】动态权限管理示例 ( 使用原生代码实现 | 申请权限 | 判定权限申请结果 | 判定 “ 不再询问 “ 情况 )
  3. java开发后台技术_java开发后台的技术
  4. XHTML Strict和Transitional 的区别
  5. 临床医生如何解读Meta分析论文?
  6. iOS瀑布流实现(Swift)
  7. 常系数齐次线性递推学习笔记
  8. Oracle表的并行度
  9. 设计模式--6大原则--迪米特法则
  10. CSS——run-in元素
  11. Weiss Ratings公布加密货币评级结果
  12. Android Bmob后端云简单使用-增删改查
  13. Unity快速入门之四 - Unity模型动画相关
  14. 苹果中国应用商店改为人民币结算 可网银充值
  15. iVMS-4200 Vs区别_【5G科普】5G知识知多少?#之5G与4G的区别
  16. 12.26:有一种关系叫做“乔布斯与比尔盖茨”
  17. 关于二叉树重构的思索
  18. View类的setVisibility()
  19. java缺省包详解_Java在其它包中无法引用缺省包中的类
  20. 初级摄影全程训练教程

热门文章

  1. Sam Altman 山姆奥特曼:关于生产率(工作效率)
  2. 极客时间左耳听风-高效学习
  3. Educational Codeforces Round 61 (Rated for Div. 2)(A、B、C、D、E、F)
  4. 利用OneDrive网盘建站
  5. 台式计算机怎样能搜无线连接,台式机怎样能够连入wifi呢
  6. 如何淡化疤痕留下的黑色色素
  7. 注册域名dns服务器,dns服务器有什么用?如何用贝锐注册域名?
  8. 克鲁斯卡尔(kruskal)算法代码释义
  9. 运动耳机排行榜10强,运动人士必备的几款运动耳机分享
  10. vue3.0的写法以及setup的用法