之前写过如何判断一个数是否是 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)所代表的数值.
也就是 101001
和 100001
得到的都是 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);