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

452 阅读2分钟

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

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

其实还有一种做法

十进制二进制
11
210
4100
81000
1610000
32100000
641000000

是不是 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 的整数次幂还没说呢?这边马上开始。

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

十进制二进制
11
4100
1610000
641000000
256100000000

感觉发现了特点,好像每个都多两个 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);

个人公众号《程序员小朱》 欢迎关注