黑马程序员——Java基础——Java中几种进制的相互转换

来源:互联网 发布:沈阳seo技术 编辑:程序博客网 时间:2024/05/16 05:22

点击打开链接 点击打开链接 点击打开链接 android培训、<a">点击打开链接 点击打开链接 java培训、期待与您交流!">点击打开链接 点击打开链接

Java中整数的三种表现形式

l 十进制:0-9,满10进1

l 八进制:0-7,满8进1

l 十六进制 0-9,A-F,满16进1,用0x开头表示。

 

     进制的由来:任何数据在计算机中都是以二进制的形式存在的。二进制早起由电信号开关演变而来。一个整数在内存中一样也是二进制的,但是使用一大串的1和0组成的数值进行使用很麻烦,所以就想把一大串缩短一点,将二进制中三位用一位表示。这三位中可以取到的最大值是7超过7就进位了,这就是8进制。但是对于过长的二进制变成八进制还是很长,所以出现用4个二进制位表现一位的情况,4个二进制最大的是15,这就是十六进制。

规律:进制越大,表现形式越短。

Java中的基本数据类型byte就是8个二进制代表一个字节。

 

二进制和十进制之间的转换

十进制转换成二进制,原理是对十进制数进行除2的运算。除2后得到的整数继续除2,直到变为1,其每次的余数排列起来就是其二进制。

二进制转换为十进制,原理是二进制乘以2的过程,例:二进制110,其十进制是:0*20+1*21+1*22=0+2+4=6.

 

其它进制之间的转换

二进制转换成八进制,三个二进制位代表一位

二进制转换成十六进制,四个二进制位代表一位

 

二进制的负数表现形式:二进制取反再加上1. 负数的最高位为1,正数最高位为0.

例:6的二进制是110,在内存中的表现形式是:0000-0000 0000-0000 0000-0000 0000-0110

  取反,就是将0变1,1变0,6取反就变成:1111-1111 111-1111   111-1111 111-1001

                    在加上1,就变成了:1111-1111 111-1111   111-1111 111-1010

         所以,-6的二进制表现形式就是:1111-1111 111-1111    111-1111 111-1010

习题:进制之间的转换。

 

//进制转换工具类,以下都是用正整数进行。class ExchTools   {//十进制转换为二进制,接收int型数据,返回string.public static String myToBinaryString(int a){//定义一个字符串容器,用于接收二进制StringBuilder binary=new StringBuilder();for(;a>0;a=a/2){             binary.insert(0,String.valueOf(a%2));}return  binary.toString();}//十进制转换成八进制,利用整数在内存中是二进制的特点public static String myToHexString(int a){StringBuilder str=new StringBuilder();for(;a>0;a=a>>3){str.insert(0,String.valueOf(a&7));}return str.toString();}//十进制转换成十六进制,public static String myToOctalString(int a){//定义字符串容器接收十六进制StringBuilder str=new StringBuilder();str.append("0X");//定义数组,使用查表法,让得到的数字找到十六进制中对应的字符。char[] arr={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};int index=0;for(;a>0;a=a>>4){index=a&15;str.insert(2,arr[index]);}return str.toString();}//二进制转换成十进制public static int myToDec(String str){StringBuilder sb=new StringBuilder();sb.append(str);//定义一个整形用于接收十进制int sum=0;for(int i=0;i<sb.length();i++){            //在这里字符不能跟字符串相等,所以一定要把字符转换成字符串if("1".equals(String.valueOf(sb.charAt(sb.length()-1-i))))    sum=sum+(1<<i);}return sum;}//二进制转换成八进制,当然也可以把二进制先转换为十进制,再转换成八进制。    public static String myToHex(String str){StringBuilder sb=new StringBuilder();sb.append(str);//定义一个容器用于接收八进制StringBuilder s=new StringBuilder();int sum=0;for(int i=0;i<sb.length();i++){            if("1".equals(String.valueOf(sb.charAt(sb.length()-1-i))))    sum=sum+((1<<i%3));if((i+1)%3==0||i==sb.length()-1){s.insert(0,String.valueOf(sum));sum=0;}}return s.toString();}//二进制转换成十六进制,当然也可以把二进制先转换为十进制,再转换成十六进制。    public static String myToOctal(String str){StringBuilder sb=new StringBuilder();sb.append(str);//定义一个容器用于接收八进制StringBuilder s=new StringBuilder();s.append("0X");char[] arr={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};int sum=0;for(int i=0;i<sb.length();i++){            if("1".equals(String.valueOf(sb.charAt(sb.length()-1-i))))    sum=sum+((1<<i%4));if((i+1)%4==0||i==sb.length()-1){s.insert(2,arr[sum]);sum=0;}}return s.toString();} //八进制转换成二进制  public static String HexToBinary(String str)  {  StringBuilder sb=new StringBuilder();  StringBuilder s=new StringBuilder();  //将八进制变成字符数组  char[] arr=str.toCharArray();  int a=0;  for(int i=0;i<arr.length;i++)  {  a=Integer.parseInt(String.valueOf(arr[i]));  for(;s.length()!=3;a=a/2)  {               s.insert(0,a%2);  }  sb.append(s);          s.delete(0,s.length());  }      return sb.toString();  }  //八进制转换成十进制  public static int HexToDec(String str)  {  int sum=0;  char[] arr=str.toCharArray();  for(int i=arr.length-1;i>=0;i--)  {  int num=Integer.parseInt(String.valueOf(arr[i]));  sum=sum+num*(1<<(3*(arr.length-1-i)));  }  return sum;  }  //八进制转换成十六进制,只能先转换成二进制再转换成十六进制  //或者先转换成十进制再转换成十六进制  public static String HexToOctal(String str)  {  return myToOctal(HexToBinary(str));  }  //十六进制转换成二进制 public static String OctalToBinary(String str)  {  StringBuilder sb=new StringBuilder();  StringBuilder s=new StringBuilder();     String ar="0123456789ABCDEF";  //将八进制变成字符数组  if(str.startsWith("0x"))      str=str.substring(2,str.length());  else  throw new RuntimeException("请输入以0X开头的十六进制数");  char[] arr=str.toCharArray();  int a=0;  for(int i=0;i<arr.length;i++)  {  a=ar.indexOf(arr[i]);  for(;s.length()<4;a=a/2)  {   if(i==0&&a==0)   break;   s.insert(0,a%2);                 }  sb.append(s);          s.delete(0,s.length());  }      return sb.toString();  }  //十六进制转换成十进制  public static int OctalToDec(String str)  {  if(str.startsWith("0x"))      str=str.substring(2,str.length());  else  throw new RuntimeException("请输入以0X开头的十六进制数");  String st="0123456789ABCDEF";  int sum=0;  char[] arr=str.toCharArray();  for(int i=arr.length-1;i>=0;i--)  {  int num=st.indexOf(arr[i]);  sum=sum+num*(1<<(4*(arr.length-1-i)));  }  return sum;  }  //十六进制转换成八进制  public static String OctalToHex(String str)  {  return myToHex(OctalToBinary(str));  }}


在java中,进制之间的转换被封装在Integer类中,这里特别复习一下Integer类

重要方法:

static String/toBinaryString(int i):十进制转换成二进制,包括负数。

static String/toHexString(int i):十进制转换成把进制,包括负数。

static String/toOctalString(int i):十进制转换成八进制,包括负数。

static string/toString(int i,int radix):十进制转换成其他进制

static int/parseInt(String s.int radix):将其他进制转换成十进制,radix是s的进制表现形式。

static Integer/valueof(String s,int radix):将其他进制转换成十进制的整数对象。

byteValue()、doubleValue()、floatValue()、intValue()、longValue()、shortValue():将Integer转成其他基本数据类型。

static int/parseInt(String s):将字符串转成十进制数。

static String/toString(int i):将整数转成字符串。

static Integer/valueOf(int i):将int值转成整数对象

static Integer/valueOf(String s):将字符串转成整数对象。

 

 

疑问;负数进制转换问题,在Integer类中整数进制转换包括负整数,二进制还可以理解,但是负数的八进制和十六进制是怎么表示的?API中是这样解释的,但还是看不懂?

toHexString

public static String toHexString(int i)

以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。 

如果参数为负,那么无符号整数值为参数加上 232;否则等于该参数。将该值转换为十六进制(基数 16)的无前导 0 的 ASCII 数字字符串。如果无符号数的大小值为零,则用一个零字符 '0' (’\u0030’) 表示它;否则,无符号数大小的表示形式中的第一个字符将不是零字符。用以下字符作为十六进制数字: 

 0123456789abcdef 

这些字符的范围是从 '\u0030' 到 '\u0039' 和从 '\u0061' 到 '\u0066'。如果希望得到大写字母,可以在结果上调用String.toUpperCase() 方法: 

 Integer.toHexString(n).toUpperCase() 

参数: 

i - 要转换成字符串的整数。 

返回: 

参数的十六进制(基数 16)无符号整数值的字符串表示形式。 

从以下版本开始: 

JDK1.0.2 

 

0 0