我就用绝招试试手——
1. 什么是查表法:
通过容器将对应的关系进行存储。通过运算得出相应关系中的其中一方的结果,再通过这个结果去容器中找对应的另一个内容。
可以这样理解:
在库房里有六个箱子,对每箱子都进行了编号,当我们要找某个箱子时,可以根据对应的编号到库房里去找相应的箱子!
2. 查表法的特点——
a) 有对应的关系——方便查询;
b) 必须要有容器——方便存储!
3. 查表法什么时候用?
当分析的问题当中存在映射关系时,可以使用查表法;
对于映射关系,如果对应的一方是有序的编号,比如数组的角标。 这时可以使用数组作为这个关系的容器将对应关系进行存储。数组就可以作为这些映射关系的存储表
4. 查表法如何用——
a) 下面通过具体的实例进行说明:
用查表法进行——进制的转换;
查表法的引出;
当我们要将十进制转换为 十六进制的时候 我们要做哪些事情呢?
以十进制60 为例:
60在内存中表示为
要进行除16 的操作,我们可以用移位操作,以4为单位向右移动!取出最低四位,然后再接着取下一个四位——用& 操作,完成
根据这个思路,接下来完成代码:
class jzDemo3
{
public static void main(String[] args)
{
toHex(-60000);
}
public static void toHex(int num )
{
char[] chs = {'0','1','2','3',
'4','5','6','7',
'8','9','a','b',
'c','d','e','f'};
//定义一个临时容器;
char[] arr = new char[8]; //字符数组在被定义后,它的默认初始化值为'\u0000'相当于空格。
int pos = arr.length ;
// 接下来 就要把 查到的字符 存到arr[] 中来,也就是要解决一个存储的问题。
while(num != 0)
{
// num 是 移动后 前面的二进制位,temp 是 运算后得到的数
int temp = num & 15;
arr[--pos] = chs[temp];
num = num >>> 4;
}
//存储数据的arr数组遍历
for(int x = pos; x < arr.length ; x++)
{
System.out.print(arr[x]);
}
System.out.println();
}
}
基本功能完成后对代码进行优化,现在只能进行十进制————十六进制,优化有可以完成十进制——十六进制 or 八进制 or 二进制的转换。
因为二进制 0 , 1
八进制 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7
这些在char [chs]里面都有所以不需要再次定义。
在进行转十六进制时右移4位,转八进制时右移3位,转二进制时右移1位,根据这个特点,进行优化:
class jzDemo4
{
public static void main(String[] args)
{
toBin(6);
toHex(60);
toBa(30);
System.out.println("Hello World!");
}
//转2
public static void toBin(int num)
{
trans(num , 1, 1);
}
//转16
public static void toHex(int num)
{
trans(num , 15, 4);
}
//转8
public static void toBa(int num)
{
trans(num , 7, 3);
}
public static void trans(int num , int base , int offset)
{
if(num == 0)
{
System.out.println(0);
return ;
}
char[] chs = {'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 & base;
arr[--pos] = chs[temp];
num = num>>> offset ;
}
for(int x = pos ; x < arr.length ; x++)
{
System.out.print(arr[x]);
}
System.out.println();
}
}
到此,用查表法 已经基本实现 进制的转换,当中尚有诸多漏洞,将在接下来修改!
敬请期待————