任意的进制转换
2013-04-17 10:06
197 查看
2013-4-11号,周四,我去搜狗面试的做的一道笔试题:把一个二进制的数转换成十六进制数,当时怎么也想不起来如何做?想着这样:先转换成十进制,再转换成十六进制。所以涉及到了进制间转换的问题。
计算机中采用的是二进制,一个数字可以用任意进制表示。
关键技术剖析:
v Java中在声明数字时默认采用的是十进制,可以在数字前加上符号表示数字采用八进制【前面加0(零)】或者十六进制【前面加上0x(零x)】。
v Java的整型封装类Integer和Long提供toString(int i,int radix)静态方法,可以将一个任意进制的整数转换为其他进制的整数。
v 使用Integer或Long的toBinaryString方法将整数转换为二进制。
v 使用Integer或Long的toOctalString方法将整数转换为八进制。
v 使用Integer或Long的toHexString方法将整数转换为十六进制。
v 使用Integer或Long的toString(int i)方法可以将其他进制的整数转换为十进制的整数的字符串表示。
public class SystemConversion {
public static void main(String[] args) {
int iOct = 0567;//八进制数字的声明,在前面加上0(零)
int iTen = 1000;//十进制数字的声明
int iHex = 0xAbcd;//十六进制数字的声明,在前面加上0x(零x),x和abcd不区分大小写
System.out.println("八进制0567装换成二进制:Integer.toString(iOct, 2)="+Integer.toString(iOct, 2));
System.out.println("八进制0567装换成二进制:Integer.toBinaryString(iOct)="+Integer.toBinaryString(iOct));
System.out.println("八进制0567装换成十进制:Integer.toString(iOct, 10)="+Integer.toString(iOct, 10));
System.out.println("八进制0567装换成十进制:Integer.toString(iOct)="+Integer.toString(iOct));
System.out.println("八进制0567装换成十六进制:Integer.toString(iOct, 2)="+Integer.toString(iOct, 16));
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,你会发现结果是一样的。
由于Unicode兼容ASCII(0~255),因此,上面得到的Unicode就是ASCII。
至于转换成二进制或其他进制,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
相关文章推荐
- java任意进制转换
- C#中使用进制转换思想对字符串进行任意进制任意字典的加密和解密
- 整数进行任意进制转换
- 进制转换 十转任意进制(最优解)
- 转帖:c#任意进制转换(2-36进制之间的转换)
- 进制转换---由任意进制转为任意进制---NOJ1592
- hdoj2031 任意进制转换
- java 任意进制转换
- 初学C#之进制转换(支持十进制小数转任意进制【2到36进制】)
- 用栈实现任意进制转换
- 任意进制转换 和 字符串整形转换函数
- 题目1080:进制转换(任意进制直接转换方法)
- sdnu oj 1041 任意进制转换
- 数据结构 栈的应用任意进制转换(c语言实现)
- java 任意进制转换
- 数据结构 使用递归任意进制转换(c语言实现)
- 心算 进制转换 心得 =》 任意进制的数 转 任意进制的数
- EASY_ZJU_PAT_ADVANCED LEVEL_1027 任意进制转换
- 任意的进制转换
- php版任意进制转换