判断一个数是否为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);

相关文章
|
8月前
|
算法 测试技术
枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)
枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)
|
7月前
|
C语言
C语言---试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?
C语言---试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?
|
8月前
|
算法 编译器 C语言
题目----水仙花数问题的实现以及对于数字每位数的求解原理分析
题目----水仙花数问题的实现以及对于数字每位数的求解原理分析
81 0
|
8月前
|
算法 测试技术
day2·算法-快乐数-有效三角形个数
day2·算法-快乐数-有效三角形个数
45 0
|
8月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
113 0
|
8月前
|
人工智能
力扣每日一题 -- 2919. 使数组变美的最小增量运算数
力扣每日一题 -- 2919. 使数组变美的最小增量运算数
|
存储
华为机试每日一练--第十一题: 求int型正整数在内存中存储时1的个数
华为机试每日一练--第十一题: 求int型正整数在内存中存储时1的个数
华为机试每日一练--第十一题: 求int型正整数在内存中存储时1的个数
|
算法
求两个数对应二进制位不同的个数(深度剖析+补充例题)
求两个数对应二进制位不同的个数(深度剖析+补充例题)
193 0
求两个数对应二进制位不同的个数(深度剖析+补充例题)
面试官:判断一个数是否为2的整数次幂
面试官:判断一个数是否为2的整数次幂
|
人工智能 C语言
C语言求100以内的偶数和、求十个数的乘积习题示例
C语言求100以内的偶数和、求十个数的乘积习题示例
440 0
C语言求100以内的偶数和、求十个数的乘积习题示例

热门文章

最新文章