JAVA十进制转十六进制(多版本)

需求:对给定的数26,获取其十六 进制的表现形式。
思路:
1.啥是十六进制,数据的一种表现形式,好处在于可以表现形式更短。
原理:将二进制中4位为一个十六进制位。
2.原来就是对给定的整数进行二进制的每4位的获取
3.咋获取每4位呢?其实就是获取四位中的1,可以通过&位运算的方式完成。
4.而且想要获取下四位,可以通过对源数据进行无符号右移方式。

步骤:
1.定义变量记录该整数
2.对该变量进行&运算,既然是获取四位,就&四个1,二进制四个1就是十进制的15,

3.对源数据进行无符号右移四位。

class Demo
{
	public static void main(String args[]){
		int num = 26;
		//&15,获取最低四位。
		int n1 = num & 15;
		System.out.println("n="+(char)(n-10+'a'));
		//对num进行右移
		num = num >>> 4;
		//在进行&15
		int n2 = num & 15;
		System.out.println("n2="+n2);
	}
}


以上动作不合适:
运算很重复,到底&15的结果是否需要做这个字母转换,无法确定,只能求出给定数的十六进制,所以需要语句来完成。
通过循环,完成重复的运算。
通过if完成是否需要字母的判断。

改良:

public class Demo {

	public static void main(String[] args) {
		int num = 26;
		String s = "";
		for(int x=1 ; x<9; x++){
			int n = num & 15;//先进行&运算求出后4位
			if(n>9){
				s = (char)(n-10+'a')+s;
				System.out.println((char)(n-10+'a'));
			}
			else{
				s = n+s;
				System.out.println(n);
			}
			num = num >>> 4;//无符号右移得出的后四位移走,继续循环求下一个四位
				
		}
		System.out.println("0x"+s);
	}

}

数组版+去零版

把计算出的每一位数当做字符按照顺序存储进字符数组,

额外定义一个方法用来输出字符数组中的字符并与字符串相连接,构成完整十六进制。

public class Demo {

	public static void main(String[] args) {
		int num = 31;
		String s = toHex(num);
		System.out.println(s);
	}
	public static String toHex(int num){
		//定义容器,存储字符,长度为8,一个整数最多8个十六进制位
		char[] chs = new char[8];
		//定义一个用于操作数组的索引
		int index = chs.length;
		while(num!=0){
			int n = num & 15;
			if(n>9){
				chs[--index]=((char)(n-10+'a'));
			}
			else{
				chs[--index]=((char)(n+'0'));
			}
			//计算下一个四位
			num = num >>> 4;
		}
		System.out.println("index="+index);
		return "0x"+toString(chs,index);
	}
	//定义一个功能将字符数组转化成字符串
	public static String toString(char[] chs, int index) {
		String s = "";
		for(int i = index;i<chs.length;i++){
			s = s+chs[i];
		}
		return s;
	}

}


终结版

需求:十进制–>十六进制,终结版。
思路:
十进制转成十六进制的每一位都是十六进制元素中的某一个。
十六进制元素有很多固定的个数,而且还有对应的编号。
所以可以用传说中的查表法

其实就是把十六进制的每一位都存入一个字符数组,利用索引直接获取数组中字符

class Noname
{
	public static void main(String args[]){
		int num = 60;
		String s = toHex(num);
		System.out.println(s);
	}
	public static String toHex(int num){
		//1.建立表
		char[] chs = {'0','1','2','3'
					,'4','5','6','7'
					,'8','9','a','b'
					,'c','d','e','f'};
		//2.创建临时容器
		char [] arr = new char[8];
		//3.创建操作临时容器的索引
		int index = arr.length;
		
		//4.通过循环对num进行 & >>>登操作
		while(num!=0){
			//5.对num进行&操作
			int temp = num & 15;

			//6.根据运算后的结果作为索引查表,获取对应的字符,并将字符存储到临时容器中
			arr[--index] = chs[temp];

			//7.对num进行右移
			num = num >>> 4;
		}
		return "0x"+toString(arr,index);
	}
	//定义一个功能将字符数组转化成字符串
	public static String toString(char[] chs, int index) {
		String s = "";
		for(int i = index;i<chs.length;i++){
			s = s+chs[i];
		}
		return s;
	}
}

十进制转八进制,十六进制都是一个道理:先通过&运算获取每一位的值,在进行右移运算循环获取下一个相应的(八,十六)进制位

只不过是十六进制要&15,八进制要&7,二进制要&1,十六进制要右移4位,八进制要右移3位二进制要右移1位。

这里还是演示一下十进制转其他进制的代码吧:

class Demo
{
	public static void main(String args[]){
		int num = 60;
		String str_hex = toHex(num);
		String str_binary = toBinary(num);
		String str_octal = toOctal(num);
		System.out.println(str_hex);
		System.out.println(str_binary);
		System.out.println(str_octal);
	}
	//十进制-->十六进制
	public static String toHex(int num){
		String s = trans(num,15,4);
		return "0x"+s;
	}
	//十进制-->二进制
	public static String toBinary(int num){
		String s = trans(num,1,1);
		return s;
	}
	//十进制-->八进制
	public static String toOctal(int num){
		String s = trans(num,7,3);
		return "0"+s;
	}
	public static String trans(int num,int base,int offect){
		//1.建立表
		char[] chs = {'0','1','2','3'
			<span style="white-space:pre">	</span>,'4','5','6','7'
				,'8','9','a','b'
				,'c','d','e','f'};
		//2.创建临时容器
		char [] arr = new char[32];
		//3.创建操作临时容器的索引
		int index = arr.length;
		
		//4.通过循环对num进行 & >>>登操作
		while(num!=0){
			//5.对num进行&操作
			int temp = num & base;

			//6.根据运算后的结果作为索引查表,获取对应的字符,并将字符存储到临时容器中
			arr[--index] = chs[temp];

			//7.对num进行右移
			num = num >>> offect;
		}
		return toString(arr,index);
	}
	//定义一个功能将字符数组转化成字符串
	public static String toString(char[] chs, int index) {
		String s = "";
		for(int i = index;i<chs.length;i++){
			s = s+chs[i];
		}
		return s;
	}
}

只要记住&和右移(>>)这两个操作一切都OK啦…




//小玩意:制表符,用来对齐
for(int i = 1; i < 10; i++){
	for(int y = 1; y < i; y++){
		System.out.print(y+"*"+i+"="+i*y+"\t");// \t制表符,可以对齐,美观
	}
	System.out.println();
}
//Windows: \r\n换行
//Linux,Unix: \n换行

    原文作者:进制转换
    原文地址: https://blog.csdn.net/a909301740/article/details/52142976
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞