2017年09月07日 14:56:01 perfectnihil 阅读数:694
java中 Integer有一个静态方法
Integer.toBinaryString
但是这个方法获取的字符串默认前面会把0去掉,有没有办法把零补齐?
方法一 通过字符串的格式化
public static void main(String args[]){ int a = 1; int b = 33; System.out.println(getFullBinaryString(a)); System.out.println(getFullBinaryString(b)); } public static String getFullBinaryString(int num){ String s = Integer.toBinaryString(num); String format = String.format("%032d", Long.parseLong(s)); return format; }
00000000000000000000000000000001
00000000000000000000000000100001
这种方法的思路是,
1.先把int值转换为无补零的字符串,
2.然后把这个字符串转换为十进制的值
3.接着利用字符串的format方法格式化使前面自动补零
但是这种方式有其不足之处,因为我们知道Long的最大数值是
9223 3720 3685 4775 807, 共十九位,也就是说如果二进制的位数超过19位,
就会出问题
1000 0000 0000 0000 0000 换算成十进制是 524288
也就是说当你要转换的int值>=524288的时候,就会出问题
我们来验证一下
public static void main(String args[]){ int a = 524288; System.out.println(getFullBinaryString(a)); } public static String getFullBinaryString(int num){ String s = Integer.toBinaryString(num); String format = String.format("%032d", Long.parseLong(s)); return format; }
这时候报错
Exception in thread "main" java.lang.NumberFormatException: For input string: "10000000000000000000"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:592)
at java.lang.Long.parseLong(Long.java:631)
at test16.Test3.getFullBinaryString(Test3.java:17)
at test16.Test3.main(Test3.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
改成524287呢
public static void main(String args[]){ int a = 524287; System.out.println(getFullBinaryString(a)); } public static String getFullBinaryString(int num){ String s = Integer.toBinaryString(num); String format = String.format("%032d", Long.parseLong(s)); return format; }
打印结果如下:
00000000000001111111111111111111
一切正常
那么,如果我们非要用这种String.format("%032d",value)的方式来获取32位int字符该怎么办呢
如果这样的话,就要想办法能够表示32位的十进制的值。
java math下有一个类叫做BigInteger 可以满足我们的需求
我们把上面的方法做一改进
public static void main(String args[]){ int a = 524288; System.out.println(getFullBinaryString(a)); } public static String getFullBinaryString(int num){ String s = Integer.toBinaryString(num); String format = String.format("%032d", new BigInteger(s)); return format; }
运行
000000000000 1000 0000 0000 0000 0000
这次我们突破了524288的限制。
我们再加下极限
public static void main(String args[]){ int a = Integer.MAX_VALUE; System.out.println(getFullBinaryString(a)); } public static String getFullBinaryString(int num){ String s = Integer.toBinaryString(num); String format = String.format("%032d", new BigInteger(s)); return format; }
运行
0111 1111 1111 1111 1111 1111 1111 1111
即便是Integer.MAX_VALUE也没有问题!
==============================================================
讲到这里,可能有同学会问,为什么格式化的时候不直接格式化成二进制的,
而非要转换成十进制再格式化呢?
其实一开始我也是想如果直接格式化岂不是更好,但是,翻了
Formatter类 的API ,貌似只有十进制,八进制,十六进制的格式化方式,没有二进制的
所以,只好先转换成十进制再来格式化。