- package test;
- //获取一个整数的16进制表现形式
- /*
- * 分析:
- * 二进制转成十六进制,其实就是四个二进制位对应一个十六进制位,思想就是
- * 把四个二进制位转换成十六进制位,这样四个四个的转
- * 举例子
- 0000 0000 0000 0000 0000 0000 0011 1100 --->60 num变量
- & 1111 --->15
- ------------------------------------------------
- 1100 ---->12=C
-
- 0000 0000 0000 0000 0000 0000 0011
- & 1111
- ---------------------------------------------------
- 0011 -->3
- 所以结果就是转成十六进制就是3c
- 因为我们要每次都要取低四位,所以我们与上15,这样就可以原模原样的得到低四位
- 人后用temp记录一下, num右移4位,在这样与15,再用temp记录一下,所以这是个
- 循环的过程,最多有8个组,所以我们让for循环的次数为8次。
- *
- * 明确1 有没有返回值?没有
- * 明确2 有没有未知内容参与?有,一个整数二进制数,int
- *
- * 什么时候用数组呢?
- 如果数据出现了对应关系,而且对应关系的一方是有序的数字编号并可以作为角标使用的情况下
- 这时候就必须要想到数组的使用了。就可以将这些数据存储到数组中,
- 根据运算的结果作为角标直接去查数组中对应的元素即可
-
- 这种方式:称为查表法
- '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
- 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ,11, 12, 13, 14,15 这么明显的对应关系,可以通过角标控制
- * */
- public class test31 {
- public static void main(String args[]){
-
- toHex(60);
- toBinary(60);
- toOctal(60);
- }
- public static void trans(int num,int base,int offset){
-
- if(num==0){
- System.out.println("0");
- return ;//一定要加上return,否则即使是满足了0这个条件还是会往下执行往下开辟空间,但是没有意义
- }
- char chs [] = {'0','1','2','3','4','5',//定义一个对应关系表
- '6','7','8','9','A',
- 'B','C','D','E','F'};//对应表是你自己在用,你放人家主函数里干嘛
-
- char []arr = new char [8];//定义临时容器,查表查到值时就存起来,不再打印
- int pos = arr.length-1;//指针,用来往数组里放数据
-
-
- while(num!=0){//用for循环得转8圈,转到num为0就行,不用转8次
- // for(int x=0;x<8;x++){//num 越来越右移,越有可能成为0,当还有有效位的时候才会执行里面的代码,去掉多余的0
- int temp = num & base;
- arr[pos--]=chs[temp];
- num = num>>>offset;
- // }
-
- }
-
- System.out.println("pos="+pos);//pos值为5,也就是角标为5
- for(int x=pos+1;x<arr.length;x++){//因为是只存了2个值,只有角标6,7有数值,所以x=pos+1
- System.out.print(arr[x]+"");
- }
-
-
- }
- public static void toBinary(int num){
- trans(num,1,1);
-
- }
- public static void toOctal(int num){
- trans(num,7,3);
-
- }
- public static void toHex(int num){
- trans(num,15,4);
-
- }
- }
复制代码
自己分析了2个小时然后才开始写的代码,分析过程很漫长,也很痛苦,但是以后多思考会熟练的,这个过程是避免不了的,我在路上…… |
|