黑马程序员技术交流社区

标题: 查表法--十进制转换为十六进制 [打印本页]

作者: 高薇    时间: 2012-7-31 09:32
标题: 查表法--十进制转换为十六进制
请教:public static void main(String[] args)
        {
                toHex(60);
        }
    public static void toHex(int num)
                {
                //定义char类型的数组存放十六进制元素
                        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-1;
                        while(num!=0)
                                {
                                        int temp=num&15;
                                        arr[--pos]=chs[temp];
                                        num=num>>>4;
                                }
                        //存储数据的arr数组遍历
                        for(int x=pos;x>=arr.length-1;x++)
                                {
                                                System.out.print(arr[x]+",");
                                }
                }
这个,用的多吗?顺便帮忙解释下,怎么都看不明白,晕晕的~
Thank you!
作者: 黑马-王言龙    时间: 2012-7-31 10:28
这是在学原理性知识,java有专门的处理方式。
  1. public class Demo {

  2.         public static void main(String[] args) {
  3.                 Integer i = 60;
  4.                 System.out.println(Integer.toHexString(i));//3c
  5.         }
  6. }
复制代码

作者: 赵建飞    时间: 2012-7-31 10:53
添加了些注释,仔细看下视频,不是很难理解。主要用来练习逻辑思维。
  1. class HexDemo
  2. {

  3. public static void main(String[] args)
  4.         {
  5.                 toHex(60);  //主函数对进制转换方法的调用
  6.         }


  7.     public static void toHex(int num)
  8.                 {
  9.                 //定义char类型的数组存放十六进制元素
  10.                         char[] chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  11.                     //定义一个临时容器
  12.                         char[] arr=new char[8];//默认初始化值:‘\u0000’
  13.                         int pos=arr.length;  //获得
  14.                         while(num!=0)   //整个循环就是要把32个二进制位四个一组转换成其对应的十六进制数
  15.                                 {
  16.                                         int temp=num&15;     //通过 “与” 操作获得 32个二进制位 中的一组 二进制位(四位一组),并转换成其对应的十进制数
  17.                                         arr[--pos]=chs[temp];//把得到的十进制数作为下标在CHS数组中获得这个十进制数对应的十六进制数
  18.                                         num=num>>>4;         //把要转换的数无符号右移四位,以便再次循环
  19.                                 }
  20.                         //存储数据的arr数组遍历
  21.                                                 //输出存放在arr数组中转换好的十六进制
  22.                         for(int x=pos;x<=arr.length-1;x++)
  23.                                 {
  24.                                                 System.out.print(arr[x]+",");
  25.                                 }
  26.    
  27.                                 }
  28. }
复制代码

作者: 黑马-王言龙    时间: 2012-7-31 10:58
public class Demo {

        public static void main(String[] args) {
                toHex(60);
        }

        public static void toHex(int num) {
                // 定义char类型的数组存放十六进制元素
                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) {
                        //60,int型,占4个字节,32位,二进制表示为:(前面26个0省略)111100。取其取低四位
                        int temp = num & 15;
                        //用拿到的四位查chs字符表,放在定义的char数组中。
                        arr[pos--] = chs[temp];
                        //二进制数右移4位(因为16进制数用二进制的4位来表示)
                        num = num >>> 4;
                }
                // 存储数据的arr数组遍历,查看其中存入的字符,即表示十进制数的16进制形式。
                for (int x = pos+1; x <= arr.length - 1; x++) {
                        System.out.print(arr[x]);
                }
        }

}
作者: 刘海源    时间: 2012-7-31 11:04
:public static void main(String[] args)
        {
                 toHex(60);
         }
     public static void toHex(int num)
                 {
                 //定义char类型的数组存放十六进制元素
                         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-1;
                         while(num!=0)
                                 {
                                         int temp=num&15;//因为十五的二进制是1111而十六进制是四个毕克伟为一个数的,这一步是为
                                                                                 //了截取一个数的二进制位而转变成十六进制
                                         arr[--pos]=chs[temp];//从后往前存入数据
                                         num=num>>>4;   //这步是为了将该数的二进制位向右移位的剔除已经识别过的
                                 }
                         //存储数据的arr数组遍历
                         for(int x=pos;x>=arr.length-1;x++)//遍历数据
                                 {
                                                 System.out.print(arr[x]+",");
                                 }
                 }
这个主要学会进制转换就可以明白的,
二进制 00000000  00000000 00000000  00000000
八进制 00000000  00000000 00000000  00000000
    三个毕克伟为一个单位就是00000000  000 000 000 000 000 000 000 000正好八位进制数是7
十六进制同理了
作者: 杨志    时间: 2012-7-31 13:23
本帖最后由 杨志 于 2012-7-31 13:25 编辑

这里要理解一个东西!
就是计算机对数据的操作是使用的补码!而不是原码!
但是对于正数,原码和补码是一样的。负数需要考虑符号位。
还有就是这里其实是先将十进制数变成2进制,然后再将2进制的数变成16进制。
那么2进制的数据和16进制的数据怎么准换呢。
其实很简单,就是16进制的数据的1位就刚好等于2进制的数据的4位。
这样的话,就可以解释下面的代码了。
  1. int temp=num&15;
复制代码
这一句代码的意思就是
将传入的十进制数的补码和15的补码进行相与操作。
那么与操作的原理是全1为1,否则为0,如1100&1010=1000;
而15的补码为:00000000-00000000-00000000-00001111;
那么就可以刚好取得num的后四位。比如num 如果为60.
那么它的补码就是:
00000000-00000000-00000000-00111100
这样和15相与 那么就得到
00000000-00000000-00000000-00001100
也就是得到了60的2进制的后四位。其实也就是相当于16进制的最后一个数字。
然后再存入数组当中。
而这个数字又是和chs表中的数字是对应的。所有就可以直接存入结构当中的最后一位。
然后:
  1. num=num>>>4;
复制代码
的目的就是讲60的后四位右移。右移之后就会变成:
00000000-00000000-00000000-00000011.
然后再去获取它的低 四位,重复上面的操作。知道num变成0为止。
核心代码就这些。希望对你有用!谢谢!





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2