java实现2进制转16进制,16进制转2进制(通过查表法和强转实现)

1、数组的进制转换

package com.vnb.javabase;

public class ArrayTest {

	//16进制数转二进制
	public static void toHex(int num){
		
		//& 两两为1即为1
		//>>>无符号右移
		/**
		 * eg.60
		 *       0000-0000 0000-0000 0000-0000 0011-1100   60的二进制表示
		 * &     0000-0000 0000-0000 0000-0000 0000-1111   15的二进制表示
		 * &后的值   0000-0000 0000-0000 0000-0000 0000-1100          值为12即16进制的C
		 */
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < 8; i++) {
			int temp = num & 15;
			if(temp>9){
				sb.append((char)(temp-10+'A'));//强转成16进制
				
			}else{
				sb.append(temp);
			}
				num = num >>>4;
		}
		System.out.println(sb.reverse());//0000003C
		
	}
	
	//查表法转换成16进制
	/**
	 * 0 1 2 3 4 5 6 7 8 9 A  B  C  D  E  F  16进制元素
	 * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
	 * 思路:把0到F的元素存到表里,0到15都有对应下标,所以将其建立一一对应关系,&15后得到的结果C直接去表里查找对应元素即可
	 * 建表:可以通过数组形式定赢,下标自动对应A到F
	 * 
	 */
	private static void toHexTable(int num){
		char[] cha = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
		//用数组存放获取到的16进制结果
		char[] arr = new char[8];
		int pos = arr.length;
		while(num!=0) { //右移后,会有很多0, 0000-0000 0000-0000 0000-0000 0000-1100,只取有效位即可,2进制0对应的10进制也是0
			int temp = num & 15;
			arr[--pos] = cha[temp];//直接从角标中获取值cha[temp]即为其16进制数,数组倒着放--pos,就不用反转数组cha[temp]
			num = num >>> 4;
		}
		System.out.println("pos:"+pos);
		//获取到cha[temp]后反转即可打印正确的char
		for (int i = pos; i < arr.length; i++) {
			System.out.print(arr[i]+",");
		}
	}
	
	//查表法,将16进制转为2进制
	//首先定义2进制的表,再定义临时存储的容器
	private static void toBinary(int num){
		char[] chs = {'0','1'};
		char[] arr = new char[32];
		int pos = arr.length;
		while(num!=0) { 
			int temp = num & 1;
			arr[--pos] = chs[temp];
			num = num >>> 1;
		}
		
		for (int i = pos; i < arr.length; i++) {
			System.out.print(arr[i]+",");
		}
	}
	
	//优化转化16进制到2进制,和2进制到16进制方法
	//相同点:都有一个临时表,都有临时容器(大的32可以包含小的8位),都要位移,都有指针
	//不同点:容器大小,位移数
	private static void convertNum(int num,int offset,int baseNum){
		char[] cha = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
		char[] arr = new char[32];
		int pos = arr.length;
		while(num!=0) { 
			int temp = num & baseNum;
			arr[--pos] = cha[temp];
			num = num >>> offset;
		}
		for (int i = pos; i < arr.length; i++) {
			System.out.print(arr[i]);
		}
	}
	
	public static void main(String[] args) {
      //toHex(60);
      //toHexTable(60);
      //toBinary(-6);
	  convertNum(6,1,1);//2进制 
	  System.out.println("");
	  convertNum(60,4,15);//16进制
	  System.out.println("");
	  convertNum(60,3,7);//8进制
	}

}

结果输出:

110
3C
74

2、二维数组在堆中的存放

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值