JAVA-初步认识-第五章-数组-常见操作-进制转换(查表法)
一. 数组的常见应用
数组在开发中什么时候用?
举例说明:
需求:获取一个整数的十六进制表现形式(要明白十六进制的表现形式是什么样子,有数字有字母)
本来应该返回一个字符串,但是还没有学到返回字符串,就改为打印,这样就没有返回值。(目前学到的返回就是两种,有数值返回值。无返回值。但是这个无返回值里面,里面可以返回的是输出语句。有没有返回的是数组类型的?很多时候思想的狭隘,来源于学的太少。)
以60为例,来进行十六进制的转换。(60也是举的一个例子,可能也无法代表所有的情况)
60为int类型,在内存中占据4个字节(在计算机中,字节这个概念应该是固定的,大小就是8位二进制)。以二进制的形式来表示60,然后再通过十六进制的形式表现出来。
换成十六进制的表现形式,可以缩短长度(所占内存是否真正变小呢?)。人为在将二进制转换为十六进制时,每四位计算一次结果。
我们现在要通过计算机语言来计算进制的转换。(虽谈说换成计算机来实现进行转化,但本质上的操作和人为的操作是一样的。)
第一步:先取出数据的最后四位
采用逻辑与运算,得出数据的最低四位。那有没有其他的方法得出二进制数据的最后四位呢?
第二步:截取次要的四位
第一个思路就是,0011-1100与运算1111-0000,但是这样得到的结果数值很大,因为后面带着4个0,而且四个0没什么用。最好的做法就是右移四位。
右移又牵涉一个知识点,>>和>>>采用哪种右移合适?答案是>>>更为靠谱。
采用>>的话,如果是被移动的数据是负数的话,补充的位都是1,1是有效位,怎么移都移不光,一直都是1.
第三步:
如果将60再往右移,60剩下的数据都是0,没有必要再去做这件事。但是如果判断剩下的数都是0呢?
核心:将一个数据转换为十六进制,就是与运算15并且不断往右移。
将前面的几步整合在一起,得到的源代码书写在上面。但是有很大的局限性,不通用,只适合于后八位存在数值的二进制数。
优化1:
尝试修改地更为通用,对于任意的int类型整数,总共在内存中占据了32个二进制位。截取四位二进制的操作要进行八次(假定32位上都有0或1)。这种重复操作,肯定是要采用循环操作。
运行的结果显示没有任何问题,但是这里还有一点,由于是转化十六进制,12不是十六进制的元素。这里的问题就是当与运算的结果大于9时,怎么将数值转换为字母?这里面又牵涉到前面的强制类型转换的知识点。在ASCII表中,A代表着65,
为什么这里不使用temp-10+65=temp+45?谁能够一直记得A的数值呢?
这里还有一点,所有的字符背后都对应的是ASCII码表么?还是说unic码表是继承了ASCII?
源程序打印之后,得到的结果是C3000000,有两个问题,C在前面和0比较多。实际上,C在前面没有错,C是先算出来的,但是和我们想要的结果不太符合。
总结:这里的讲解,我看并没有涉及数组的概念。还有一点,我们在计算机中,输入一个十进制的数,如果不是和运算符什么的联系在一起(>>4),那么在计算机的内部展现的其实是二进制的表现形式。
二. 数制转换-查表法
前言:刚才我们能得出-10+'A'这种算法,是将十六进制的元素列完了,找到了它们和数字的对应关系。在上面的对应关系中,上面一排都是十六进制的元素,下面都是有序的数字,有序的数字从0开始数,都在进行递增。下面一排符合数组的下标。→这就告诉我们什么时候使用数组。
什么时候使用数组?
注解:数组的特点有很多,固定的长度,是个容器,存储同一类型数据...但是这种情况要着重说明。如果数据出现了对应关系,而且对应关系一方是有序的数字编号,并作为角标使用,这时必须想到数组的使用。就可以将这些数据存储到数组中,根据运算的结果作为角标,直接去查数组中对应的元素即可。这种方式就称为查表法。数组就是那个映射关系表。只要能找到这种关系和规律,就可以采用这种方法。查表法本身就是一种思想。
只要数据多了,就可以使用数组,查表法只是数组的一种常见的应用。
思想:如果发现了对应关系,没有发现,有规律的数字变化。这时也可以使用,采用的是map集合。
查表法比之前简洁的多,但是还是有问题没解决,C依旧在前面,0还是有很多。
这里问题的产生,来源于得到一个结果就打印输出,多个数据分批次打印输出。解决的办法就在于先存储起来,最后再输出。这样就涉及到了数组。一旦数据多了,就要想到数组。一会儿查出来的数据更多,都要存储起来。
要想往数组里面装元素,就要用到指针。操作数组不可能没有指针。数组的核心思想就是角标,角标就是指针?
造成很多0的原因,就是循环了多次。循环有效地数据即可。
这里没有采用for循环,而是采用了while循环。数组存储数据后,都是自动从0开始编号的。这里面的pos++,先将pos值代入运算,最后将pos进行++。
剩下的空间里都是空字符,定义的是字符数组。空格字符。
DOS 结果显示为下图,0没了,空格还在,同时顺序也是倒着的。(前面在没有使用数组时,使用for循环语句全部输出,这里是先用数据存储起来再输出,有什么区别么。)
出现很多空格,是我们输出到了arr.length,我们输出到pos即可。(在num不符合退出循环时,pos已经自增了,如果按照pos输出的话,其实还是多输出一次,但是打印的时候是x<pos,相当于又抵消了一次。)
这时,数据仍然是倒着的,想到调换数据。如果采用之前讲述的调换数据的话,之前的操作都是两两调换,在这个具体的例子中是可以使用的,但是通用的时候,是要很多数据全部调换的,那就需要设置for嵌套来不断地调整。
但是还有空格存在,从pos开始取,
这里还有一个问题,如果传的数据是0,最后DOS显示是没有结果,
这里还有一种是,在if中输入return,
有无return的区别在于,有return里面返回,方法就结束了,下面的语句就不需要再操作,不需要再创建空间...
可见return不是我们想像的那么简单。