2013-4-11号,周四,我去搜狗面试的做的一道笔试题:把一个二进制的数转换成十六进制数,当时怎么也想不起来如何做?想着这样:先转换成十进制,再转换成十六进制。所以涉及到了进制间转换的问题。
计算机中采用的是二进制,一个数字可以用任意进制表示。
关键技术剖析:
v
v
v
v
v
v
public
public
int
int
int
System.out.println("八进制0567装换成二进制:Integer.toString(iOct,
System.out.println("八进制0567装换成二进制:Integer.toBinaryString(iOct)="+Integer.toBinaryString(iOct));
System.out.println("八进制0567装换成十进制:Integer.toString(iOct,
System.out.println("八进制0567装换成十进制:Integer.toString(iOct)="+Integer.toString(iOct));
System.out.println("八进制0567装换成十六进制:Integer.toString(iOct,
System.out.println("八进制0567装换成十六进制:Integer.toHexString(iOct)="+Integer.toHexString(iOct));
System.out.println();
System.out.println("十进制1000装换成十六进制:Integer.toString(iTen,16)="+Integer.toString(iTen,16));
System.out.println("十进制1000装换成十六进制:Integer.toHexString(iTen)="+Integer.toHexString(iTen));
System.out.println("十进制1000装换成八进制:Integer.toString(iTen,8)="+Integer.toString(iTen,8));
System.out.println("十进制1000装换成八进制:Integer.toOctalString(iTen)="+Integer.toOctalString(iTen));
System.out.println("十进制1000装换成二进制:Integer.toString(iTen,2)="+Integer.toString(iTen,2));
System.out.println("十进制1000装换成二进制:Integer.toBinaryString(iTen)="+Integer.toBinaryString(iTen));
System.out.println();
System.out.println("十六进制0xAbcd装换成十进制:Integer.toString(iHex,10)="+Integer.toString(iHex,10));
System.out.println("十六进制0xAbcd装换成十进制:Integer.toString(iHex)="+Integer.toString(iHex));
System.out.println("十六进制0xAbcd装换成八进制:Integer.toString(iHex,8)="+Integer.toString(iHex,8));
System.out.println("十六进制0xAbcd装换成八进制:Integer.toOctalString(iHex)="+Integer.toOctalString(iHex));
System.out.println("十六进制0xAbcd装换成二进制:Integer.toString(iHex,2)="+Integer.toString(iHex,2));
System.out.println("十六进制0xAbcd装换成二进制:Integer.toBinaryString(iHex)="+Integer.toBinaryString(iHex));
System.out.println();
//还可将任意进制的整数装换成其他任意进制的数字
System.out.println("十六进制0xAbcd装换成七进制:Integer.toString(iHex,7)="+Integer.toString(iHex,7));
}
}
程序输出:
八进制0567装换成二进制:Integer.toString(iOct, 2)=101110111
八进制0567装换成二进制:Integer.toBinaryString(iOct)=101110111
八进制0567装换成十进制:Integer.toString(iOct, 10)=375
八进制0567装换成十进制:Integer.toString(iOct)=375
八进制0567装换成十六进制:Integer.toString(iOct, 2)=177
八进制0567装换成十六进制:Integer.toHexString(iOct)=177
十进制1000装换成十六进制:Integer.toString(iTen,16)=3e8
十进制1000装换成十六进制:Integer.toHexString(iTen)=3e8
十进制1000装换成八进制:Integer.toString(iTen,8)=1750
十进制1000装换成八进制:Integer.toOctalString(iTen)=1750
十进制1000装换成二进制:Integer.toString(iTen,2)=1111101000
十进制1000装换成二进制:Integer.toBinaryString(iTen)=1111101000
十六进制0xAbcd装换成十进制:Integer.toString(iHex,10)=43981
十六进制0xAbcd装换成十进制:Integer.toString(iHex)=43981
十六进制0xAbcd装换成八进制:Integer.toString(iHex,8)=125715
十六进制0xAbcd装换成八进制:Integer.toOctalString(iHex)=125715
十六进制0xAbcd装换成二进制:Integer.toString(iHex,2)=1010101111001101
十六进制0xAbcd装换成二进制:Integer.toBinaryString(iHex)=1010101111001101
十六进制0xAbcd装换成七进制:Integer.toString(iHex,7)=242140
分析下java内部如何实现进制的转换的
十进制转换为二进制:
看算法之前我们先了解下java的移位运算:
移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。
在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是移动66次和移动2次得到的结果相同。
386 以后的硬件把移位对字长进行取模,右移32位就是右移了0位(CPU 把右移的位数 32 对于字长 32 进行取模运算,得到 0),因此 9 右移 32 位仍然是 9。你可以换一下for循环的条件,比如换成i<=64,你会发现结果是一样的。
至于转换成二进制或其他进制,Java API提供了方便函数,你可以查Java的API手册。
学习下原理,否则永远都不会。
十进制转换为其它进制:
10进制转换成其他的都是除以要转换成的那个数,也就是说转换成二进制的就除以2,转换成八进制的就除以8,转换成十六进制的就除以16,然后倒取余数。具体例题如下
10---2:把20转换成二进制
20/2=10..........余数为0
10/2=5...........余数为0
5/2=2............余数为1
2/2=1............余数为0
1/2=0............余数为1
则20换成二进制后是10100
10---8:把20转换成八进制
20/8=2...........余数为4
2/8=0............余数为2
则20转换成八进制后是24
10---16:把20转换成十六进制
20/16=1..........余数为4
1/16=0...........余数为1
则20转换成十六进制后是14
其它进制转换为十进制:
2---10:把二进制数1101转换成十进制
1101=1*2的0次方+0*2的1次方+1*2的2次方+1*2的3次方=13
则1101变成十进制后是13
8---10:把八进制数1340转换成十进制
1340=0*8的0次方+4*8的1次方+3*8的2次方+1*8的3次方=736
则1340变成十进制后是736
16---10:把十六进制数3A4F转换成十进制
3A4F=15*16的0次方+4*16的1次方+10*16的2次方+3*16的3次方=14927
(十六进制中的A是10,F是15)
二、十六进制数互相转换
二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。
只要把十六进制对照的二进制码记住,十六进一看就转换出来了.
二、八进互相转换
二进制数要转换为八进制,就是以3位一段,分别转换为八进制,
二进制与八进制的相互转换:
八进制数 0 1 2 3 4 5 6 7
二进制数 000 001 010 011 100 101 110 111
二进制与十六进制的相互转换:
十六进制 0 1 2 3 4 5 6 7 B
二进制数 0000 0001 0010 0011 0100 0101 0110 0111 1011
二进制与十六进制的关系 2进制 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 16进制 0 1 2 3 4 5 6 7 8 9 a(10) b(11) c(12) d(13) e(14) f(15) 可以用四位数的二进制数来代表一个16进制,如3A16 转为二进制为: 3为0011,A 为1010,合并起来为00111010。可以将最左边的0去掉得1110102 右要将二进制转为16进制,只需将二进制的位数由右向左每四位一个单位分隔,将各单位对照出16进制的值即可。
package com.jinzhizhuanhuan;
/**
* 功能:将一个数从M进制转换成N进制
* MValue:M进制数的字符串表示方法
* Shang:保存中间运算结果
* M:M进制 N:N进制
*/
public class M2N {
// 在这里对输入赋值
public static String MValue = "15";
public static String Shang = null;
public static int M = 10;
public static int N = 2;
public static void main(String[] args) {
String nValue = "";
Shang = MValue;
while (Shang.length() > 0) {
nValue = qiuyu(Shang) + nValue;
}
System.out.println(nValue);
}
/**
* 功能:对给定的M进制字符串对n求余。
*
* @param MTempValue
* @param m
* @param n
* @return
*/
public static String qiuyu(String MTempValue) {
Shang = "";
int temp = 0;
while (MTempValue.length() > 0) {
int t = getIntFromStr(MTempValue.substring(0, 1));
MTempValue = MTempValue.substring(1);
temp = temp * M + t;
Shang += getStrFromInt(temp / N);
temp = temp % N;
}
while (Shang.length() > 0 && Shang.charAt(0) == '0') {
Shang = Shang.substring(1);
}
return getStrFromInt(temp);
}
public static int getIntFromStr(String str) {
return str.charAt(0) <= '9' && str.charAt(0) >= '0' ? str.charAt(0) - '0'
: str.charAt(0) - 'a' + 10;
}
public static String getStrFromInt(int value) {
String result = null;
if (value >= 0 && value <= 9)
result = String.valueOf((char) ('0' + value));
else if (value > 9 && value < 36) {
result = String.valueOf((char) ('a' + value - 10));
} else {
result = "-1";// 出错误了
}
return result;
}
}
参考链接:
http://www.cnblogs.com/pkuoliver/archive/2010/10/27/Convert-m-number-to-n-number.html