面试官:判断一个数是否为2的整数次幂

简介: 面试官:判断一个数是否为2的整数次幂

题目

判断一个正整数是否是2的整数幂(如4是2的2次方,返回true;5不是2的整数次幂,则返回false)。要求性能尽可能高。

第一种考虑(乘法)

创建一个中间变量temp,初始值是1,然后进入一个循环,每次循环都让temp和目标值进行比较,如果相等,则说明目标是2的整数次幂,如果不相等,则让temp乘以2,继续循环比较,直到temp的值大于目标整数时,说明整数不是2的整数次幂。

比如:18

1*2=2;2比18小继续

2*2=4;4比18小继续

4*2=8;8比18小继续

8*2=16;16比18小继续

16*2=32;32比18大退出循环,说明18不是2的整数幂。

如果目标整数的大小是n,则此方法循环次数是logn。

代码如下:

ublic static boolean is2Power1(int num) {
    int temp = 1;
    while (temp <= num) {
        if (temp == num) {
            return true;
        }
        temp = temp << 1;
//            temp = temp * 2;
    }
    return false;
}

想一想,有没有更好的办法?

第二种考虑(除法)

2的整数次幂都能被2整除,所以进入一个循环,让目标对2求余,如果有余数,则目标不是2的整数次幂,如果没有余数,然后目标赋值为目标除以2,直到目标小于1,当目标小于1的时候则说明明目标是2的整数次幂。

比如:18

18%2=0;18被2整除

18/2=9;目标赋值为9

9%2=1;9没被2整除退出循环,说明18不是2的整数幂。

如果目标整数的大小是n,则此方法循环次数有可能是1,2,3,4,...logn次。

代码如下:

public static boolean is2Power2(int num) {
    while (num > 1) {
        if (num % 2 == 1) {
            return false;
        }
//            num = num / 2;
        num = num >> 1;
    }
    return true;
}

再想一想,有没有更好的办法?

第三种考虑(位运算)

让我们看看2的整数次幂转成二进制是什么样的

col 1 col 2 col 3
十进制 二进制 是否为2的整数次幂
8 1000
16 10000
32 100000
64 1000000
100 1100100

是不是发现了,如果一个整数是2的整数次幂,那么当它转化成二进制时,只有最高位是1,其它位都是0!如果把这2的整数次幂各自减去1,在转换成二进制,会是什么样呢?

col 1 col 2 col 3 col 4
十进制 二进制 原数值减1 是否为2的整数次幂
8 1000 111
16 10000 1111
32 100000 11111
64 1000000 111111
100 10000000 1111111

是不是发现了,2的整数幂减去1时,它的二进制数字都变成1了!如果在加上&运算符会出现什么结果呢?

col 1 col 2 col 3 col 4 col 5
十进制 二进制 原数值减1 n&n-1 是否为2的整数次幂
8 1000 111 0
16 10000 1111 0
32 100000 11111 0
64 1000000 111111 0
100 10000000 1111111 1100000

怎么样会写代码了吗?

代码如下:

public static boolean is2Power3(int num) {
    return (num & num - 1) == 0;
}

是不是很简单,只要动用所学过的知识点,联系起来,一个问题就迎刃而解!!!

相关文章
|
4月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
38 0
【剑指offer】-1~n整数中1出现的次数-31/67
【剑指offer】-1~n整数中1出现的次数-31/67
|
11月前
|
算法
剑指Offer - 面试题16:数值的整数次方
剑指Offer - 面试题16:数值的整数次方
34 0
|
11月前
剑指offer 44. 从1到n整数中1出现的次数
剑指offer 44. 从1到n整数中1出现的次数
49 0
|
测试技术 BI
软件测试面试题:统计在一个队列中的数字,有多少个正数,多少个负数,如[1, 3, 5, 7, 0, -1, -9, -4, -5, 8]
软件测试面试题:统计在一个队列中的数字,有多少个正数,多少个负数,如[1, 3, 5, 7, 0, -1, -9, -4, -5, 8]
106 0
|
算法
【刷算法】数值的整数次方
【刷算法】数值的整数次方
(JAVA编程练习):一个整数,它加上100后是平方数,再加上168又是一个平方数,该数是?+ 输入三个数,进行小到大排序。
(JAVA编程练习):一个整数,它加上100后是平方数,再加上168又是一个平方数,该数是?+ 输入三个数,进行小到大排序。
(JAVA编程练习):一个整数,它加上100后是平方数,再加上168又是一个平方数,该数是?+ 输入三个数,进行小到大排序。
|
程序员 Python
程序员数学基础【四、取模应用-判断奇偶数、判断素数、求两个数的最大公约数、水仙花数】(Python版本)(二)
程序员数学基础【四、取模应用-判断奇偶数、判断素数、求两个数的最大公约数、水仙花数】(Python版本)(二)
125 0
程序员数学基础【四、取模应用-判断奇偶数、判断素数、求两个数的最大公约数、水仙花数】(Python版本)(二)
|
程序员 数据安全/隐私保护 C++
程序员数学基础【四、取模应用-判断奇偶数、判断素数、求两个数的最大公约数、水仙花数】(Python版本)(一)
程序员数学基础【四、取模应用-判断奇偶数、判断素数、求两个数的最大公约数、水仙花数】(Python版本)(一)
158 0
程序员数学基础【四、取模应用-判断奇偶数、判断素数、求两个数的最大公约数、水仙花数】(Python版本)(一)
|
机器学习/深度学习
[剑指offer] 整数中1出现的次数(从1到n整数中1出现的次数)
本文首发于我的个人博客:尾尾部落 题目描述 求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。
1491 0