进制转化

 

包括十进制转化为二进制,八进制,十六进制

 

十进制转化为二进制使用的是位移运行和位与运算

十进制转化为八进制就是就是十进制数直接除以8,得出得整数就是八进制的十位以前的数,余数是八进制个位数,然后不断循环

十进制转化为十六进制同八进制

 

package cn.Offer;

import java.util.Scanner;

/*
 * 把一个整数(任何整数,包括正数或者负数)转化为二进制
 * 获取中间1的个数 
 * 
 * 各种做法都是对各种进制每位的分解再组合
 * 那么组合的方式有使用字符串连接,栈,数组
 * 这里使用的都是字符串连接
 */

public class Exam10_HexadecimalConversion {

    public static void main(String[] args) {
        
        System.out.println("请输入一个整数");
        
        
        Scanner sc= new Scanner(System.in);        
        int value = sc.nextInt();
        System.out.println("结果:");
        System.out.println("这个整数的二级制是" + ConventIntToBinary(value));
        int num = NumOf1InBinary(value);
        System.out.println("其中包含了"+num+"个 1 ");        
        
        System.out.println("这个整数的八进制是" + ConventIntToBase8(value));
        System.out.println("这个整数的十六进制是" + conventIntToBase16(value));
        
                
    }
    

    /*
     * 十进制转化为十六进制
     */
    private static String conventIntToBase16(int value) {
        String strResultString = "";
        
        while(value>16)
        {            
            String r = value%16+"";
            
            if(value%16>10)
            {
                r= Character.toString((char)((int)('A') + (value%16 -10)));
            }            
            
            strResultString = r + strResultString;
            value=value/16;
        }
        
        strResultString = value + strResultString;
        
        return strResultString;
    }


    /*
     * 十进制转化为八进制
     */
    private static String ConventIntToBase8(int value) {
        String strResultString="";
        
        
        while(value>8)
        {            
            strResultString = value%8 + strResultString;
            value=value/8;
        }
        
        strResultString = value + strResultString;
        
        return strResultString;
    }


    /*
     * 计算二进制里1 的个数
     * 判断结束的标识使用flag==0
     * 因为flag不断左移,移动32次之后,为0
     */
    private static int NumOf1InBinary(int value) {
        int count = 0;        
        int flag = 1;
        while(flag!=0)
        {
            if((value & flag)!=0)
                count++;
            flag=flag<<1;
        }        
        return count;
    }

    
    /*
     * 把十进制转化为二进制
     * 返回的结果的类型
     * 如果是int类型,显然不行,因为返回的是二进制,二进制可以达到32位数字,不管是int还是long类型都不可以,
     * 因为32位的数字在内存中占用的是32*8位
     * 
     * 返回字符串
     * 
     * 判断结束的标识,
     * 如果使用的是flag = 0 ,那么100返回的结果是00000000000000000000000001100100
     * 使用value =0,返回结果是1100100
     * 
     */
    private static String ConventIntToBinary(int value) {        
        String strResultString = "";        
        int flag = 1;        
        while(value!=0)  
        {
            if((value & flag)!=0)
            {
                strResultString = 1+strResultString ;
                value = value^ flag;                    
            }else {
                strResultString =0+ strResultString ;
            }
             flag = flag<<1;                       
        }        
        //return Long.parseLong(strResultString);
        return strResultString;

    }

}

 

顺便说下把十六进制转化为十进制

/*
     * 十六进制转化为十进制
     */
    private static int ConventBase16ToBase10(String value16) {
        int result =0;
        
        if(value16=="")
        {
            return 0;            
        }
        
        char[] v16 = value16.toCharArray();
        for(int i=0;i<v16.length;i++)
        {
            int key=0;
            char v = v16[v16.length-1-i];
            if(v>='A' && v<='F')
            {
                key= v-'A' +10;
            }else{
                key= v-'0';
            }
            
            result = result + key* (int)Math.pow(16, i);
        }
        
        return result;
    }

 

posted on 2014-08-05 16:18  飞鸟快跑  阅读(373)  评论(0编辑  收藏  举报