思考

如何判断一个数是不是2的N次幂?
难道要一直除下去?一直乘过去?还是打表?
我们就不能简单一些处理这个问题吗?
那就有了这篇博客的内容——位运算判断一个数是不是2的N次幂……

核心算法

其实就是:(num & num-1) == 0

&表示按位取且,运算规律是(在二进制的情况下):

  • 1 & 1 = 1
  • 1 & 0 = 0
  • 0 & 1 = 0
  • 0 & 0 = 0

Java编程实现

private static boolean isPowOfTwo(int num) {return (num & num-1) == 0;
}

算法正确性

我们把一个十进制的数当成二进制来看。

Q:2的N次幂的二进制有什么特点?

先枚举一些例子:
1 → 00000001
2 → 00000010
4 → 00000100
8 → 00001000
……

A:二进制表示的情况下只有一位(非最高位)是1

我们不加以形式化地证明一下:

假设不是2的N次幂,这个数起码就要比2大(我们只考虑正整数),至少也是00000011(8位二进制表示),那么非0的就不止1个,至少2位非0。
那么对于num-1,一定不会去到最高位非0位去“借位”,所以最高非0位一定不変,还是1。
既然我们按位取且,所以num & num-1(注意位运算的优先级弱于加减,可以这么写而不加括号)至少会在num原先的最高非0位保持1,(因为1&1=1),这样的结果就不可能是0(因为0是00000000)。

所以我们就能发现,只有在num是2n(0≤n, n∈N+)的情况下,(num & num-1) == 0为真。

完整代码

import java.util.Scanner;public class JudgePowOfTwo {private static boolean isPowOfTwo(int num) {return (num & num-1) == 0;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();scanner.close();System.out.println(isPowOfTwo(num));}}

2021.3.24更新
如果是考虑到0的话,应该这么写:((num!=0)&&(num&num−1))==0((num!=0)\&\&(num\&num-1))==0((num!=0)&&(num&num−1))==0

【Java】位运算判断2的N次幂相关推荐

  1. Java位运算之2的N次幂、整数转换、寻找只出现一次的数

    Java位运算 位运算:只能对整数进行位运算,可加快计算机计算速度.因为所有数在内存中都是以二进制存放,故直接对数的二进制位进行操作非常快,比如乘法.除2操作:通过左右移二进制位即可,无需将数转为十进 ...

  2. java int越界_用位运算判断int类型变量越界

    今天在做一道oj题的时候,遇到了一个情景,需要判断经过操作后的int类型数是否越界.我直接很暴力地比较和int类型的最大最小值来判断是否越界.但还想思考一下用位运算判断是否越界的方法,顺便巩固一下位运 ...

  3. java位运算求幂,程序员必学:快速幂算法

    前阵子,有小伙伴在我B站的算法教程底下留言 小伙伴们有任何疑问或者希望我解说任何内容,都可以在我的小我私家B站或民众号(xmg_mj)留言哦,我会尽我最大能力.只管抽时间去写文章\录视频来回应人人. ...

  4. Java位运算优化:位域、位图棋盘等

    快速小测试:如何重写下面的语句?要求不使用条件判断语句交换两个常量的值. if (x == a) x= b; else x= a; 答案: x= a ^ b ^ x; //此处变量x等于a或者等于b ...

  5. Java位运算,常见的位运算

    前提 位运算符中 ,操作数只能为整型和字符型数据 运算符号 按位与(&):同1则1 → true&&true 操作数1 0 0 1 1 操作数2 0 1 0 1 按位与 0 0 ...

  6. Java位运算总结:位运算用途广泛

    前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...

  7. 一篇搞定位运算——java位运算详解

    java位运算详解 前言 一.位运算符 &:按位与 |:按位或 ~:按位非 ^:按位异或 <<:左位移运算符 >>:右位移运算符 <<<:无符号右移运 ...

  8. Java位运算的基础及使用(意义)

    Java位运算的基础及使用(意义) 前言 一.位运算基础 二.位运算应用 三.位运算试题 前言 这几天在看HashMap的源码,但里面的位运算太多,看得有点晕.故,先整理位运算相关知识. 在了解位运算 ...

  9. 用一句位运算判断两个整数的大小并返回较大者

    2019独角兽企业重金招聘Python工程师标准>>> 用一句位运算判断两个整数的大小并返回较大者,不用if..else,不用循环,不用switch,不用条件运算符 const in ...

最新文章

  1. Servlet学习笔记(三)之HttpServletRequest
  2. vue的递归组件以及三级菜单的制作
  3. 力软 java主从表保存_JAVA常用知识总结(十二)——数据库(二)
  4. Spring项目使用Junit4测试配置
  5. Spring Boot中日志框架的使用——Logback
  6. 零基础学python难吗-终于明白0基础学python难吗
  7. 20150917-html第二次课
  8. 租用服务器怎么免去后顾之忧?
  9. 5.2 tensorflow2实现多元线性回归、完成广告投放销售额预测——python实战
  10. redis list操作_PHP操作Redis相关函数
  11. InfoGAN 生成时序序列
  12. golang tailf日志组件的基本使用
  13. 也谈谈Linux下recv函数的使用
  14. Android项目中调用第三方app
  15. c语言 交互式电子白板案例,交互式电子白板教学案例——电子白板让修改习作不再难...
  16. 2022-2027(新版)中国工业5G技术行业发展动态与前景规划分析报告
  17. 微信支付:请求参数与订单信息不一致
  18. 华为MH5000模块知识应用简介
  19. 海外代购的那些事。系列连载教程攻略! 今天你代购了吗?
  20. 红外人体感应传感器SR602模块使用说明

热门文章

  1. POJ1426-Find The Multiple(DFS)
  2. 转 【MQTT】在Windows下搭建MQTT服务器
  3. 第12课第2.2节 字符设备驱动程序之LED驱动程序_测试改进
  4. boost库 bind/function的使用
  5. 隐藏文字的另一种方法
  6. 去掉viewstate保持在页面中的一大串字符的方法
  7. 从马云看“穷男人”如何创业——看后信心倍增!
  8. Postgre合并多行数据为一行
  9. _Linux结束进程到底有多少种方法?
  10. linux rt 应用程序,RTlinux编程