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、二维数组在堆中的存放