一、十进制转二进制

方法一:输入一个十进制数n,每次用n除以2,把余数记下来,然后再用商去除以2……依次循环,直到商为0结束,把余数倒着依次输出即为转换后的二进制

public void decimalToBinary(int n){
    String res = "";
    while(n != 0){
        res = n % 2 + res;
        n = n / 2;
    }
    System.out.println(res);
}

方法二:与1相与得到最低位的数字,右移一位与1相与得到次低位的数字,依次移位相与,得到每一位数字输出

public void decimalToBinary(int n){
    String res = "";
	while(n != 0){
        res = n & 1 + res;
        n = n >>> 1;
    }
    System.out.println(res);
}

二、十进制转八进制

方法一:输入一个十进制数n,每次用n除以8,把余数记下来,然后再用商去除以8……依次循环,直到商为0结束,把余数倒着依次输出即为转换后的八进制

public void decimalToOctal(int n){
    String res = "";
    while(n != 0){
        res = n % 8 + res;
        n = n / 8;
    }
    System.out.println(res);
}

方法二:十进制17二进制为10001,我们想转换为八进制的话一般三位一读,不足三位补0,后三位001即读为1,还剩10补0后变为010,读为2,所以八进制转换为21,以此思想转为代码如下:

public void decimalToOctal(int n){
    String res = "";
    while(n != 0){
        res = n & 7 + res;
        n = n >>> 3;
    }
    System.out.println(res);
}

三、十进制转十六进制

方法一:输入一个十进制数n,每次用n除以16,把余数记下来,这里与上面不同,余数可能会超过10,所以还要有一个对应的字符映射表,然后再用商去除以16……依次循环,直到商为0结束,把余数倒着依次输出即为转换后的十六进制

public void decimalToHex(int n){
    char[] ch = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    String res = "";
    while(n != 0){
        res = ch[n % 16] + res;
        res = n / 16;
    }
    System.out.println(res);
}

方法二:十进制162二进制为10100010,我们想转换为十六进制的话一般四位一读,不足四位补0,后四位0010即读为2,还剩1010读为A,所以十六进制转换为A2,以此思想转为代码如下:

public void decimalToHex(int n){
    char[] ch = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    String res = "";
    while(n != 0){
        res = ch[n & 15] + res;
        res = n >>> 4;
    }
    System.out.println(res);
}

四、十进制转二、八、十六进制总结

我的代码尽量写成了同一形式,便于发现规律。第一种方法就是常规思想,无论什么进制都可以用这种方法,对基数不断取余,再将得到的余数反转即可。第二种方法其实算是第一种的进化版,第一种方法是取余(%)和求商(/)操作,因为基数的特殊性(2,8,16都是2的幂),所以第二种方法中对应可以变为&和右移>>>的位运算操作,加快运算速度,但这种方法对转换成七进制、九进制这种就不管用了。

如果将方法封装的话可以写成如下:

方法一

public void toBin(int n){
    trans(n, 2);
}
public void toOtc(int n){
    trans(n, 8);
}
public void toHex(int n){
    trans(n, 16);
}
public void trans(int n, int base){
    char[] ch = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    String res = "";
    while(n != 0){
        res = ch[n % base] + res;
        n = n / base;
    }
    System.out.println(res);
}

方法二

public void toBin(int n){
    trans(n, 1, 1);
}
public void toOtc(int n){
    trans(n, 7, 3);
}
public void toHex(int n){
    trans(n, 15, 4);
}
public void trans(int n, int base, int offset){
    char[] ch = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    String res = "";
    while(n != 0){
        res = ch[n & base] + res;
        n = n >>> offset;
    }
    System.out.println(res);
}

五、二进制转十进制

思想:如果二进制为10010的话就是1*21+1*24

public int binaryToDecimal(String s){
    int res = 0;//存储结果
    int t = 0;  //第几位
    int i = s.length()-1;
    while(i >= 0){
        if(s.charAt(i) == '1')
            res += (int)Math.pow(2, t);
        i--;
        t++;
    }
    return res;
}

六、八进制转十进制

思想:如果八进制为71的话就是1*80+7*81

public int octalToDecimal(String s){
    int res = 0;
    int t = 0;
    int i = s.length()-1;
    while(i >= 0){
        int num = s.charAt(i)-'0';
        res += num * (int)Math.pow(8, t);
        i--;
        t++;
    }
    return res;
}

七、十六进制转十进制

思想:与之前相同,不过要多加一个字母数字映射表

public int hexToDecimal(String s){
    int res = 0;
    int t = 0;
    int i = s.length()-1;
    while(i >= 0){
        char ch = s.charAt(i);
        int num = 0;
        switch(ch){
            case 'A':
                num = 10;
                break;
            case 'B':
                num = 11;
                break;
            case 'C':
                num = 12;
                break;
            case 'D':
                num = 13;
                break;
            case 'E':
                num = 14;
                break;
            case 'F':
                num = 15;
                break;
            default:
                num = ch - '0';
        }
        
        res += num * (int)Math.pow(16,t);
        i--;
        t++;
    }
    return res;
}

八、二进制与八进制、十六进制

这些进制可以通过十进制为桥梁,进行互转,比如说八进制要转为十六进制,那么可以先将八进制转为十进制,然后将十进制转为十六进制。