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进制也是0int temp = num & 15;arr[--pos] = cha[temp];//直接从角标中获取值cha[temp]即为其16进制数,数组倒着放--pos,就不用反转数组cha[temp]num = num >>> 4;}System.out.println("pos:"+pos);//获取到cha[temp]后反转即可打印正确的charfor (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、二维数组在堆中的存放