之前写过如何判断一个数是否是 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);
复制代码

个人公众号《程序员小朱》 欢迎关注
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END























![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)