Java进阶之二进制基础

前言

本篇将讲解Java中JDK内置的进制转换以及在Java中,数据类型之间的转换机制和过程。
图片、部分源程序源自慕课网。

一、Java中JDK内置的进制转换

JAVA内置的进制转换
注:其中的‘其他进制转换成十进制’,还有其他方法,如下所示:

Integer.parseInt(“0101”, 2)  // 二进制转换成十进制
Integer.parseInt(“376”, 8)   //  八进制转换成十进制
Integer.parseInt(“FFFF”, 16)   //  十六进制转换成十进制

将‘其他进制转换成十进制’有两种方法,其区别如下:

  1. Integer.valueOf(String s, int radix)
    1)这个方法实际上是将以其他进制形式表示的字符串转换成Integer类型的包装类。
    2)其后面可以加上‘.toString()’方法将其转换成字符串。
    3)当然,就算没有加上‘.toString()’方法,java内置系统也会默认帮你转换。
    4)因此在下面可以看到有加和没加‘.toString()’方法,输出的结果都一样。
  2. Integer.parseInt(String s, int radix)
    1)这个方法实际上是将以其他进制形式表示的字符串转换成int类型的数据。
    2)其后面不允许加上‘.toString()’方法,因为转换后的数据仅仅是一个int类型的数据,并非对象。
    3)因此也就不可能调用‘.toString()’方法了。

代码如下:


public class RadixMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 十进制转为其他进制
		System.out.println(Integer.toBinaryString(5201314));  // 二进制
		System.out.println(Integer.toHexString(5201314));     // 十六进制
		System.out.println(Integer.toOctalString(5201314));   // 八进制
		
		System.out.println("------------------这是一条分隔符-----------------");
		
		// 其他进制转换为十进制
		/**
		 * 注:在此可用两种方法将其他进制转换成十进制:
		 * 1、Integer.valueOf(String s, int radix)
		 *    这个方法实际上是将以其他进制形式表示的字符串转换成Integer类型的包装类
		 *    其后面可以加上‘.toString()’方法将其转换成字符串
		 *    当然,就算没有加上‘.toString()’方法,java内置系统也会默认帮你转换
		 *    因此在下面可以看到有加和没加‘.toString()’方法,输出的结果都一样
		 * 2、Integer.parseInt(String s, int radix)
		 *    这个方法实际上是将以其他进制形式表示的字符串转换成int类型的数据
		 *    其后面不允许加上‘.toString()’方法,因为转换后的数据仅仅是一个int类型的数据,并非对象
		 *    因此也就不可能调用‘.toString()’方法了。
		 */
		System.out.println(Integer.valueOf("0101", 2).toString());  // 二进制转换为十进制
		System.out.println(Integer.valueOf("0101", 2));  // 二进制转换为十进制
//		System.out.println(Integer.parseInt("0101", 2).toString()); // 二进制转换为十进制
		System.out.println(Integer.parseInt("0101", 2)); // 二进制转换为十进制
		
		System.out.println(Integer.valueOf("520", 8));    // 八进制转换为十进制
		System.out.println(Integer.valueOf("FD", 16));   // 十六进制转换为十进制
	}
}

运行结果:
Java内置的进制转换的运算结果

二、Java中的进制

  1. Java中的二进制在跨平台中用的比较多,如:‘文件读写’、‘数据通信’等。

  2. Java中的数据类型如下:
    1)基本数据类型有四种:
    int数据类型:byte(8bit, -128~127)、short(16bit)、int(32bit)、long(64bit)
    float数据类型:单精度(32bit float)、双精度(64bit double)
    boolean类型变量的取值有:true、false
    char数据类型有:unicode字符,16位
    2)对应的包装类如下:

Integer、Float、Boolean、Character、Double、Short、Byte、Long
  1. 整型数据转化为字节
    例:8143(0000 0000 0000 0000 0001 1111 1100 1111)
    => byte [] b = [-49, 31, 0, 0]
    从右向左数:
    第一个字节:8143 >> 0*8 & 0xff = (1100 1111) = 207(或有符号-49)
    第二个字节:8143 >> 1*8 & 0xff = (0001 1111) = 31
    第三个字节:8143 >> 2*8 & 0xff = (0000 0000) = 0
    第四个字节:8143 >> 3*8 & 0xff = (0000 0000) = 0

  2. 字符串与字节数组之间的相互转换
    1)字符串 —> 字节数组:String s; byte[] bs = s.getBytes();
    2)字符数组 —> 字符串:

byte[] bs = new byte[int];
String s = new String(bs); 或 String s = new String(bs, encode); // encode指的是编码方式
  1. 源程序如下:
package com.radix.byteoperate;

public class Convert {

	/**
	 * int型数据转化为 byte[]型数据
	 * @param id
	 * @return
	 */
	public static byte[] int2Bytes(int id){
		byte[] arr = new byte[4];
		/**
		 * 注:将int型变量转换成byte[]数组存储进内存中的步骤如下:
		 *     1、把变量id的值左移‘0*8’之后,将其强制转换为int型
		 *     2、接着再与‘0xff’进行与运算
		 *     3、然后再将两者进行与运算得到的值强制转换成byte型
		 *     4、最后再将其赋值给arr[0],即:arr[]数组的第一个元素
		 */
//		arr[0] = (byte)((int)(id >> 0*8) & 0xff);
//		arr[1] = (byte)((int)(id >> 1*8) & 0xff);
//		arr[2] = (byte)((int)(id >> 2*8) & 0xff);
//		arr[3] = (byte)((int)(id >> 3*8) & 0xff);
		// 将其改装成for循环的形式, 更加通用一些
		for(int i = 0; i < arr.length; i++){
			arr[i] = (byte)((int)(id >> i*8) & 0xff);
		}
		return arr;
	}
	
	/**
	 * byte[]型数据转换成int型数据
	 */
	public static int bytes2Int(byte[] arr){
		/**
		 * 根据arr数组的每一个字节来得到与之相对应的整数
		 * 再将其相加,即可将byte[]型数据转换成int型数据
		 * 其步骤如下:
		 * 1、将byte[]型数据逐个与‘0xff’进行与运算操作
		 * 2、接着将两者进行与运算后得到的值进行左移‘i*8’的操作
		 * 3、然后将左移后的值强制转换成int型数据
		 * 4、最后再将int型数据赋值给变量deci(i代表变化的整数值)
		 */
//		int dec0 = (int)((arr[0] & 0xff) << 0*8);
//		int dec1 = (int)((arr[1] & 0xff) << 1*8);
//		int dec2 = (int)((arr[2] & 0xff) << 2*8);
//		int dec3 = (int)((arr[3] & 0xff) << 3*8);
		// 将其改装成for循环的形式, 更加通用一些
		int result = 0;
		for(int i = 0; i < arr.length; i++){
			result += (int)((arr[i] & 0xff) << i*8);
		}
//		return dec0 + dec1 + dec2 + dec3;
		return result;
	}
	
	/**
	 * long型数据转化为 byte[]型数据
	 * @param id
	 * @return
	 */
	public static byte[] long2Bytes(long id){
		byte[] arr = new byte[8];
		/**
		 * 注:将int型变量转换成byte[]数组存储进内存中的步骤如下:
		 *     1、把变量id的值左移‘0*8’之后,将其强制转换为int型
		 *     2、接着再与‘0xff’进行与运算
		 *     3、然后再将两者进行与运算得到的值强制转换成byte型
		 *     4、最后再将其赋值给arr[0],即:arr[]数组的第一个元素
		 */
//		arr[0] = (byte)((int)(id >> 0*8) & 0xff);
//		arr[1] = (byte)((int)(id >> 1*8) & 0xff);
//		arr[2] = (byte)((int)(id >> 2*8) & 0xff);
//		arr[3] = (byte)((int)(id >> 3*8) & 0xff);
		// 将其改装成for循环的形式, 更加通用一些
		for(int i = 0; i < arr.length; i++){
			arr[i] = (byte)((int)(id >> i*8) & 0xff);
		}
		return arr;
	}
	
	/**
	 * byte[]型数据转换成long型数据
	 */
	public static long bytes2Long(byte[] arr){
		/**
		 * 根据arr数组的每一个字节来得到与之相对应的整数
		 * 再将其相加,即可将byte[]型数据转换成int型数据
		 * 其步骤如下:
		 * 1、将byte[]型数据逐个与‘0xff’进行与运算操作
		 * 2、接着将两者进行与运算后得到的值进行左移‘i*8’的操作
		 * 3、然后将左移后的值强制转换成int型数据
		 * 4、最后再将int型数据赋值给变量deci(i代表变化的整数值)
		 */
//		int dec0 = (int)((arr[0] & 0xff) << 0*8);
//		int dec1 = (int)((arr[1] & 0xff) << 1*8);
//		int dec2 = (int)((arr[2] & 0xff) << 2*8);
//		int dec3 = (int)((arr[3] & 0xff) << 3*8);
		// 将其改装成for循环的形式, 更加通用一些
		long result = 0;
		for(int i = 0; i < arr.length; i++){
			result += (long)((arr[i] & 0xff) << i*8);
		}
//		return dec0 + dec1 + dec2 + dec3;
		return result;
	}
	
	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 由于‘int2Bytes()’为静态方法,因此可以通过类名直接调用
		byte[] arr = Convert.int2Bytes(8143);
		// 可以看到控制台中输出的结果为:-49,31,0,0
		System.out.println(arr[0] + "," + arr[1] + "," + arr[2] + "," + arr[3]);
		System.out.println(Convert.bytes2Int(arr));
		// 字符串与字符数组之间的转换
		String message = "你好,欢迎来到java的世界!";
		byte[] stringToByte = message.getBytes();
		String byteToString = new String(stringToByte);
		System.out.println(byteToString);
	}

}

  1. 运行结果:
    字符串与字节数组相互转换的运行结果

猜你喜欢

转载自blog.csdn.net/chenlintao_csdn/article/details/87914370