一、十进制转二进制
方法一:输入一个十进制数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;
}
八、二进制与八进制、十六进制
这些进制可以通过十进制为桥梁,进行互转,比如说八进制要转为十六进制,那么可以先将八进制转为十进制,然后将十进制转为十六进制。