`
arcticfox9902
  • 浏览: 107198 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

Java里的二进制转换

 
阅读更多

      数字在计算机中是以补码形式保存的,正数的原码、反码、补码都是一样的,而负数的补码是其反码加1。因此,正整数的二进制转换比较容易,负整数就略微复杂一点了。

      负整数由十进制转换为二进制的步骤为:取反,加1。例如:将-5转换为二进制的步骤如下:

      首先,5的二进制为101,扩展到32位为00000000 00000000 00000000 00000101,取反之后为11111111 11111111 11111111 11111010,加1之后就是11111111 11111111 11111111 11111011,这就是-5的二进制表示。

      负整数由二进制转换成十进制也是一样的步骤:取反,加1。继续用上面的例子,-5的二进制11111111 11111111 11111111 11111011取反之后为00000000 00000000 00000000 00000100,加1为00000000 00000000 00000000 00000101,这个二进制的值是5,而最初的二进制数的第一位是1,表示负数,因此转换之后是-5。

 

      Java源码里提供了一些函数来进行这样的进制转换,例如:Integer.toBinaryString(int i)返回i的二进制字符串表示,Integer.toHexString(int i)返回i的十六进制字符串表示,Integer.toOctalString(int i)返回i的八进制字符串表示,另外,Integer.toString(int i, int radix)返回i的radix进制表示,但和之前的方法有所不同,我们来看看下面的例子:

System.out.println(Integer.toString(-5, 2));
System.out.println(Integer.toBinaryString(-5));

System.out.println(Integer.toString(5, 2));
System.out.println(Integer.toBinaryString(5));

 输出结果为:

-101
11111111111111111111111111111011
101
101 

 当需要转换的数字为正数,则上面的两个函数返回结果是一样的,当需要转换的数字为负数时,结果就大不同了,toString(i, radix)函数返回的是-101,而toBinaryString(i)返回的才是与-5对应的真正的二进制字符串。八进制、十六进制也是一样的。

      相应的,Java源码里也提供了二进制转换为十进制的函数,例如:Integer.parseInt(String s, int radix)、Integer.valueOf(String s, int radix),这两个函数返回结果完全一样,事实上valueOf(s, radix)内部直接调用了parseInt(s, radix)函数,但是需要注意,这两个函数与上面的Integer.toString(int i, int radix)的操作是相反的,参数s是“-101”这种形式的,不是真正的二进制(或八进制、十六进制)表示。

 

ps:真正的二进制字符串转换为十进制的函数不知道Java源码里有没有,如果有以后再补上。

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics