Java基础:十进制转换其他进制

  ------- android培训java培训、期待与您交流! ----------

 

       平时使用中,进制转换只要使用Integer这个包装类中的方法即可完成。

       但其实我们也能用自己的方法去实现,这有助于初学者对于计算机底层运算的理解。下面例子使用了查表形式的方法来完成的进制的转换。

       在开始前,需要先理解清楚各个进制的特点还有位的概念。

 

       众所周知,在计算机中,内存保存的都是二进制的数据,即通过0,1来表示数据的内容。

       位(bit)就是代表二进制数据个中的每一个0或1,bit是计算机中的最小单位。

       需要注意的是计算机基本存储单位是字节(byte),它用8个二进制位表示,即1 byte = 8 bit。

 

       java可以支持八进制,十进制,十六进制的表示,分别是:

       八进制:前置0,如用八进制表示5要写成05。
       十进制:不需前置,如5就是十进制中的5.
       十六进制:前置0x或者0X,如用十六进制表示5要写成0x5。

 

       如果生成值为60的int类型的数据,它在内存会占用32位的空间。如下所示:

       0000-0000 0000-0000 0000-0000 0011-1100

       十六进制的数值用0~9和A~F这16个数来表示,当满足16,则进位。60在java中用十六进制来表示为:0x3C,在内存中表现为:

      

       八进制的数值用0~7这8个数来表示,当满足8,则进位。60在java中用八进制来表示为:074,在内存中表现为:

      

 

       从以上规律可以看出,二进制中每4个位(2的4次幂=16),就表示十六进制中1个位,而要得出16进制位上的数值,可以使用位运算 & 15(二进制数1111)得出。

       同理,二进制中每3个位(2的3次幂=8),就表示八进制中1个位,而要得出8进制位上的数值,可以使用位运算 & 7(二进制数111)得出。

 

       基于以上的分析,可以设计一下代码:

class Transform 
{
    public static void main(String[] args) 
    {
        toHex(60);
        toba(60);
        toBin(60);
    }

//十进制转二进制
    public static void toBin (int num)
    {
        trans(num,1,1);
    }

//十进制转八进制
    public static void toba (int num)
    {
        trans(num,7,3);
    }

//十进制转十六进制
    public static void toHex (int num)
    {
        trans(num,15,4);
    }

//    具体转换过程。
//    方法中第一个参数为需要转换的数 ,第二参数为位运算&上的数,第三个参数为要移动的二进制位。
    public static void trans (int num,int base,int offset)
    {
//        定义一个数组,角标对应数值,可以看做一个查询表。
        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;

        if(num==0)
        {
//            如果要转换的数为0,则无需转换。
            System.out.println(0);
        }

        while(num!=0)
        {
//            得出指定进制中每一位的数值,存入一个数组中。
            int temp = num & base;
            arr[--pos] = chs[temp];
//            每得出一个指定进制一个位上的值后,原数值的二进制位就往右移动指定位数,并在前面补零。
            num = num >>> offset;      //移位补零。
        }
        
        for(int x=pos;x<arr.length;x++)
        {
            if (x==(arr.length-1)) {
                System.out.println(arr[x]);                
            } else {
                System.out.print(arr[x]);    
            }
        }
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值