判断一个数是否为4的整数次幂(2的升级版--双份快乐)

简介: 判断一个数是否为4的整数次幂(2的升级版--双份快乐)

之前写过如何判断一个数是否是 2 的整数次幂,不知道大家是否还有印象。

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

其实还有一种做法

十进制 二进制
1 1
2 10
4 100
8 1000
16 10000
32 100000
64 1000000

是不是 1 后面全是 0

是不是我们只要判定除了第一位是 1 以外,其余全是 0 就可以了呢。

但是如何获取他的二进制呢。。。

好吧我上网查一下吧,得到下面

Integer.tobinaryString()

那我们就开始吧。

private static boolean test(int num) {
    //先判断数字是否大于 0
    if (num > 0) {
        //如果是1的话
        if (num == 1) {
            return true;
        }
        //获取二进制
        String s = Integer.toBinaryString(num);
        //去掉第一个元素1
        s = s.substring(1);
        int zero = Integer.parseInt(s, 2);
        if (zero == 0) {
            return true;
        }
    }
    return false;
}

写这么多,才得到结果。人家短短一行,你这十来行。你公司是按行发工资的吗?必须简化!

好吧,那就简化一下吧。

private static boolean test(int num) {
    return return n >0 && (Integer.highestOneBit(num) == num);
}

问: Integer.highestOneBit() 这个是干嘛用的呢?
答: 是用来获取最左边的bit(其他bit位为0)所代表的数值.

也就是 101001100001 得到的都是 100000

说了这么多,4 的整数次幂还没说呢?这边马上开始。

同理先获取其对应的二进制

十进制 二进制
1 1
4 100
16 10000
64 1000000
256 100000000

感觉发现了特点,好像每个都多两个 00 ,也就是说它只要满足 1后面全是 0 ,切 0 的个数是偶数倍就可以了呀。

那就是先满足第和 2 的整数幂一样的条件 return n >0 && (Integer.highestOneBit(num) == num); 然后在获取其转成二进制的长度是奇数(偶数个 0 在加一个 1)就可以了。 Integer.toBinaryString(num); 这个可以获取转成二进制的字符串然后 Integer.toBinaryString(num).length() % 2 ==1 这不成了!

所以结果是

return num >0 && (Integer.highestOneBit(num) == num) && (Integer.toBinaryString(num).length() % 2 ==1);

相关文章
|
4月前
|
C++ Java Go
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
28 0
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
|
4月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
38 0
|
5月前
|
人工智能
力扣每日一题 -- 2919. 使数组变美的最小增量运算数
力扣每日一题 -- 2919. 使数组变美的最小增量运算数
|
10月前
|
C语言
C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)
C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)
108 0
面试官:判断一个数是否为2的整数次幂
面试官:判断一个数是否为2的整数次幂
华为机试每日一练--第十一题: 求int型正整数在内存中存储时1的个数
华为机试每日一练--第十一题: 求int型正整数在内存中存储时1的个数
华为机试每日一练--第十一题: 求int型正整数在内存中存储时1的个数
|
算法
求两个数对应二进制位不同的个数(深度剖析+补充例题)
求两个数对应二进制位不同的个数(深度剖析+补充例题)
119 0
求两个数对应二进制位不同的个数(深度剖析+补充例题)
|
Java
统计1到N的整数中,除了1和自身之外,至少还能被两个数整除的数的个数Java开方平方根
统计1到N的整数中,除了1和自身之外,至少还能被两个数整除的数的个数Java开方平方根
112 0
|
测试技术
软件测试面试题:如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。 例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加, 1+2+3=6。第二个完全
软件测试面试题:如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。 例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加, 1+2+3=6。第二个完全
402 0
|
算法 Java
Java实现2个数字的平方和等于一个数字(leetcode算法题)
Java实现2个数字的平方和等于一个数字(leetcode算法题)
230 0
Java实现2个数字的平方和等于一个数字(leetcode算法题)