判断一个数字是否是2的N次方

简介: 判断一个数字是否是2的N次方

今天看到小伙在看一个判断一个数是否为2的N次方的博客,我有点印象,就过去装逼了结果一下子还真没想出来,装逼失败!

这道题目其实是 leetcode 上面的第231道题目,题目内容如下:

给定一个整数,编写一个函数来判断它是否是 2 的幂次方
• 1

 我一开始是想到如果是10进制内10的多少次方的时候应该是什么样子:

10^n 数值 n
10^0 1 0
10^1 10 1
10^2 100 2
10^3 1000 3

我们很自然的看出来,如果我们平时的10进制,其实就是一位数上是1,其他都是0。这个想到我们计算2^n的时候,应该是1,2,4,8,16依次下去,由此想到这种情况下在二进制的情况:

2^n 数值 10进制
2^0 1 1
2^1 10 2
2^2 100 4
2^3 1000 8

我们其实很容易发现,2的多少次方的情况就是二进制位数上一个数是1其他都是0,我们的思路其实就是想办法把二进制数中的1消掉,剩下的是0就行,当然前提条件是这个数>大于0,我们可以使用二进制的中的清零最低位的1操作x&(x-1),这个表示的是我们把最低位的1去掉,看看剩下的值,运算过程如下:

2^n n n-1 n&n-1
2^0 1 0 0
2^1 10 01 00
2^2 100 011 000
2^3 1000 0111 0000

其他情况也可以看看

十进制 n n-1 n&n-1
3 11 10 10
5 101 100 100
6 110 101 100
7 111 110 110

可以看到n&(n-1)的效果就是会把n的二进制位最低的那位1抹掉,在2^n次方的情况抹掉一个0剩下的就全是0了,其他情况的话不会是0,所以相应的只要位运算的操作就可以出来结果,代码贴上,附上测试数据:

public class Leecode_231_35 {

    public static void main(String[] args) {
        Leecode_231_35 lc = new Leecode_231_35();
        System.out.println(lc.isPowerOfTwo(0));
        System.out.println(lc.isPowerOfTwo(1));
        System.out.println(lc.isPowerOfTwo(2));
        System.out.println(lc.isPowerOfTwo(3));
        System.out.println(lc.isPowerOfTwo(4));
        System.out.println(lc.isPowerOfTwo(5));
        System.out.println(lc.isPowerOfTwo(6));
        System.out.println(lc.isPowerOfTwo(7));
        System.out.println(lc.isPowerOfTwo(8));
        System.out.println(lc.isPowerOfTwo(9));
        System.out.println(lc.isPowerOfTwo(-2147483648));
    }

    public boolean isPowerOfTwo(int n) {
        return n > 0 && (n &= n - 1) == 0;
    }
}

当然,这种高效一次运算的操作,自然时间复杂度就是最最让人喜欢的O(1)了

目录
相关文章
|
缓存 Linux 程序员
老程序员分享:linux下netlink的使用简介
老程序员分享:linux下netlink的使用简介
|
前端开发 JavaScript 算法
前端框架介绍
前端框架介绍
|
缓存 Java 测试技术
RecyclerView 优化—滑动性能提升
RecyclerView 优化—滑动性能提升
632 0
|
JSON Dubbo Java
Feign远程调用
本节基于Feign实现替换RestTemplate发起Http请求,在此过程中会发现技术演进的过程是不断变化的,最初引入RestTemplate的确帮我们解决了跨服务调用,但是随着更为优雅的技术出现时,我们会毫不犹豫去实践更佳的解决方案,这也是我们最初提出单体架构-->分布式架构的演变过程。 本节希望能重点关注Feign提出的初衷,最佳实践,并能够结合最佳实践在日后工作中得以落地。
|
Python
【Python】解决pandas读取excel,以0向前填充的数字会变成纯数字
本文介绍了两种解决Python使用pandas库读取Excel时,数字前填充的0丢失问题的方法:一是在读取时指定列以字符串格式读取,二是在Excel中预先将数值转换为文本格式。
956 0
【Python】解决pandas读取excel,以0向前填充的数字会变成纯数字
|
Java 开发工具 Android开发
如何访问 android系统hide的类或接口
如何访问 android系统hide的类或接口
639 1
|
数据采集 SQL DataWorks
DataWorks常见问题之double计算精度如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
489 0
|
传感器 监控 数据可视化
【智慧工地源码】物联网和传感器技术在智慧工地的应用
可在电脑端、手机端对安全隐患数据进行记录、查询;实现安全隐患发起、整改、复查的闭环管理;具备对安全隐患数据进行统计、可视化分析、信息推送等;包含对危险性较大的分部分项工程进行巡查记录功能 。
529 1
|
JavaScript 前端开发 API
如何将宜搭数据和已有系统/三方数据打通?
如何将宜搭数据和已有系统/三方数据打通?低代码如何渐进式的满足业务? 使用场景: - 定时将数据拉回到自建系统中进行精加工或归档 - 将表单提交、流程发起操作的入口集成到现有平台上 - 想通过宜搭中的「动作面板」去写 JS 代码,实现自己的业务逻辑或逻辑判断
722 0
如何将宜搭数据和已有系统/三方数据打通?