黑马程序员技术交流社区

标题: 进制转换问题 [打印本页]

作者: 黑马-陈思源    时间: 2013-3-25 18:24
标题: 进制转换问题
本帖最后由 黑马-陈思源 于 2013-3-25 21:10 编辑

class jinzhi
{
        public static void main(String[] args)
        {
                //ToBin(16);
                //ToHex(60);
                //ToHex_CheckT(60);
                ToBin_CheckT(-6);
        }
        
        //十进制转二进制的函数
        //思路:十进制转二进制就是除2取模的过程
        public static void ToBin(int num)
        {
                //定义一个容器
                StringBuffer sb=new StringBuffer();
                while(num>0)
                {
                        sb.append(num%2);
                        num=num/2;
                }
                System.out.println(sb.reverse());
        }
        
        //十进制转二进制的函数   查表法
        //思路  参照转十六进制
        public static void ToBin_CheckT(int num)
        {
                //定义一个表
                char[] chs={'0','1'};
                char[] arr=new char[32];//二进制能装32个十进制的数  int型 32位。   long才是 64位 满。
                int pos=arr.length;//定义一个长度
                while(num!=0)
                {
                        int temp=num&1;//每次取2的模  (每次&1)
                        arr[--pos]=chs[temp];//while循环中数组循环赋值
                        num=num>>>1;//每次循环除2(每次右移一位)
                }
                System.out.println("你所输入的十进制数转换为二进制为:");
                //遍历数组
                for(int i=pos;i<arr.length;i++)
                {
                        System.out.print(arr+",");
                }
        }
        
        //十进制转十六进制的函数
        //思路:(temp-10+'A')  意思是  得出十六进制中超过9的子母部分。
        public static void ToHex(int num)
        {
                StringBuffer sb=new StringBuffer();
                for(int i=0;i<8;i++)
                {
                        int temp=num & 15;
                        if(temp>9)
                                sb.append((char)(temp-10+'A'));
                        else
                                sb.append(temp);
                        num=num>>>4;
                }
                System.out.println(sb.reverse());
        }
        
        
        //十进制转十六进制的函数   查表法!!!
        //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
        //一一对应  就可以把0到F保存到一个数组中  实现  该函数。
        public static void ToHex_CheckT(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];
                int pos=arr.length;//定义一个长度
                while(num!=0)
                {
                        int temp=num & 15;
                        arr[--pos]=chs[temp];//while循环中数组循环赋值
                        num=num>>>4;//每次循环右移4位
                }
                System.out.println("你所输入的十进制数转换为十六进制为:");
                //遍历数组
                for(int i=pos;i<arr.length;i++)
                {
                        if(i==arr.length-1)//最后一位不带逗号
                                System.out.print(arr);
                        else
                                System.out.print(arr+",");
                }
               
        }
}


ps:请教一下。关于十进制转换为不同的进制的时候  位移几位  是根据什么来定的?




作者: 刘海东    时间: 2013-3-25 18:47
进制转换的代码,它的思想其实和我们自己运算的一样。比如,十进制转换为二进制,我们通常的做法就是除以二取余数,至这个数到0或者1,除以2可以把代码写成num=num>1,。十六进制就是除以16取余数,除以十六就把代码写成num=num>4,八进制就是除以8取余数,除以十六就把代码写成num=num>3。这里的右移是根据位运算决定的。右移一位就是除以2的1次方,右移两位就是除以2的两次方,右移4位就是除以2的4次方,依此类推。
作者: 炉海佳    时间: 2013-3-25 18:49
本帖最后由 炉海佳 于 2013-3-25 18:51 编辑

比如 转换成16进制,四个二进制位就是一个十六进制位。
0101--1010
  5     a(10)    0101就是5 ,1010就是10也就是a
转成8进制是 三个二进制位代表一位
001--011--010
1        3      2
也就是由几个二进制位代表一位所决定的


作者: HM朱蛟    时间: 2013-3-25 20:14
LZ不必纠结于各种进制间的转换  我最开始学习进制转换的时候也是各种 查资料     什么小数二进制转换  负数二进制转换   什么8进制直接转成16进制
后来我回头再去看的时候 其实大可不必这么耗费精力  

只需要将2进制当做一座桥梁即可  意思就是懂得如何将其他进制转换为2进制就行了 就是无论几进制转换为几进制  先转成2进制 然后再将2进制转换为另一个进制   看上去挺费事 其实比你耗费精力去研究各种进制转换算下来更省事

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
N转10:
方法:N-->二-->十

16-->10
十六:3B  --> 二: 0011 -1011---->十:59
                    48    11   <-累加
10-->8
八:750  --> 二: 111-101-000---->:十488
                 1-1110-1000   
                256  224  8   <-累加


10转N:缺位从左边补0

方法:十-->二-->N

10-->16
十:78  --> 二: 0100 -1110---->十六:0x4E
                  4    14    <-分开算
10-->8
十:90  --> 二: 0  01-011-010---->八:132
                   1   3   2  <-分开算


10进制负数二进制:取反+1
-6:其实就是6的2进制取反+1;
6=110
   001   取反的意思就是将二进制1变成0,二进制的0变成1;
001 + 001 =010


总结:
10转N,N转10,中间都要转成二进制来过渡,
N转10中,16进制取4个2进制位一组,结果分开算,8进制取3个2进制位1组,结果分开算。
10转N中,16进制取4位2进制一组,结果累加,8进制取3个2进制位1组,结果累加。


作者: 黑马-陈思源    时间: 2013-3-25 21:10
谢谢各位~~~{:soso_e163:}




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