【Java】位运算判断2的N次幂
思考
如何判断一个数是不是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次幂相关推荐
- Java位运算之2的N次幂、整数转换、寻找只出现一次的数
Java位运算 位运算:只能对整数进行位运算,可加快计算机计算速度.因为所有数在内存中都是以二进制存放,故直接对数的二进制位进行操作非常快,比如乘法.除2操作:通过左右移二进制位即可,无需将数转为十进 ...
- java int越界_用位运算判断int类型变量越界
今天在做一道oj题的时候,遇到了一个情景,需要判断经过操作后的int类型数是否越界.我直接很暴力地比较和int类型的最大最小值来判断是否越界.但还想思考一下用位运算判断是否越界的方法,顺便巩固一下位运 ...
- java位运算求幂,程序员必学:快速幂算法
前阵子,有小伙伴在我B站的算法教程底下留言 小伙伴们有任何疑问或者希望我解说任何内容,都可以在我的小我私家B站或民众号(xmg_mj)留言哦,我会尽我最大能力.只管抽时间去写文章\录视频来回应人人. ...
- Java位运算优化:位域、位图棋盘等
快速小测试:如何重写下面的语句?要求不使用条件判断语句交换两个常量的值. if (x == a) x= b; else x= a; 答案: x= a ^ b ^ x; //此处变量x等于a或者等于b ...
- Java位运算,常见的位运算
前提 位运算符中 ,操作数只能为整型和字符型数据 运算符号 按位与(&):同1则1 → true&&true 操作数1 0 0 1 1 操作数2 0 1 0 1 按位与 0 0 ...
- Java位运算总结:位运算用途广泛
前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...
- 一篇搞定位运算——java位运算详解
java位运算详解 前言 一.位运算符 &:按位与 |:按位或 ~:按位非 ^:按位异或 <<:左位移运算符 >>:右位移运算符 <<<:无符号右移运 ...
- Java位运算的基础及使用(意义)
Java位运算的基础及使用(意义) 前言 一.位运算基础 二.位运算应用 三.位运算试题 前言 这几天在看HashMap的源码,但里面的位运算太多,看得有点晕.故,先整理位运算相关知识. 在了解位运算 ...
- 用一句位运算判断两个整数的大小并返回较大者
2019独角兽企业重金招聘Python工程师标准>>> 用一句位运算判断两个整数的大小并返回较大者,不用if..else,不用循环,不用switch,不用条件运算符 const in ...
最新文章
- Servlet学习笔记(三)之HttpServletRequest
- vue的递归组件以及三级菜单的制作
- 力软 java主从表保存_JAVA常用知识总结(十二)——数据库(二)
- Spring项目使用Junit4测试配置
- Spring Boot中日志框架的使用——Logback
- 零基础学python难吗-终于明白0基础学python难吗
- 20150917-html第二次课
- 租用服务器怎么免去后顾之忧?
- 5.2 tensorflow2实现多元线性回归、完成广告投放销售额预测——python实战
- redis list操作_PHP操作Redis相关函数
- InfoGAN 生成时序序列
- golang tailf日志组件的基本使用
- 也谈谈Linux下recv函数的使用
- Android项目中调用第三方app
- c语言 交互式电子白板案例,交互式电子白板教学案例——电子白板让修改习作不再难...
- 2022-2027(新版)中国工业5G技术行业发展动态与前景规划分析报告
- 微信支付:请求参数与订单信息不一致
- 华为MH5000模块知识应用简介
- 海外代购的那些事。系列连载教程攻略! 今天你代购了吗?
- 红外人体感应传感器SR602模块使用说明