一、不同进制有共同的特点:
1、逢进制(或称基数)进位。
2、进制的数有0~(X-1)共X个数码。
3、数的值不仅仅取决于数码的大小,还取决于它所在的位置。
每一位数的数值=数码×位权,这就是所谓的位置记数法,公式 称为安权展开式。没有小数时为: 。
n——整数部分的位数
m——小数部分的位数
x——进制数(基数)
——系数(0~x-1中任意一个数)
例:没有小数的情况下
任意二进制数N= ,基数是2, 代表0~1,各位位权是 。
任意八进制数N= ,基数是8, 代表0~7,各位位权是 。
任意十六进制数N= ,基数是16, 代表0~9,A,B,C,D,E,F(其中A,B,C,D,E,F表示10~15),各位位权是 。
注:由于基数不同,同样一个数代表的值是不同的,原因在于位权不同。
如 =1×104+1×103+0×102+1×101+1×100=11011
=1×24+1×23+0×22+1×21+1×20=27
=1×164+1×163+0×162+1×161+1×160=69649
不同进制的数,常用如上的脚标来区别,也可以加一个后缀字母来标识其进制,一般用B标识二进制、用Q标识八进制、用H标识十六进制、用D或空标识十进制。如:78999D、3344Q、7FFFH、11100101B分别表示十、八、十六、二进制数。
★ 、二、各种进制数之间的转换
1、R(R=2,8,16)进制数转换为十进制的数(按权展示求和法)
例:分别将 、 、 转换为十进制数。
=1×26+1×25+0×24+1×23+1×22+0×21+1×20+0×2-1+1×2-2+0×2-3+1×2-4=
=3×83+5×82+0×81+6×80+2×8-1+4×8-2=
=8×163+15×162+12×161+7×160+2×16-1=
2、十进制数转换为R(R=2,8,16)进制数(转换方法:整数部分除基取余数,小数部分乘基取整法(“基”即进制数))
例 1:将 分别转换为二进制、八进制、十六进制数。(用除基取余法实现)
2 57 余数 2 28 … 1 低位 2 14 … 0 2 7 … 0 2 3 … 1 2 1 … 1 0 … 1 高位 |
8 57 余数 8 7 … 1 低位 0 … 7 高位 |
16 57 余数 16 3 … 9 低位 0 … 3 高位 |
所以, = = =
法二:
十进制数转换为八进制数、十六进制数时,还可以先转化为二进制数,然后再按下面3的方法进行转换。
例2、将 转换为二进制数。(分别用除2取余法和乘2取整法对整数部分和小数部分进行转换,然后拼接起来。)
由例 1知 = ,对 进行转换如下:
取整数部分
0.3125×2 = 0 .625 a-1=0 高位
0.625×2 = 1 .25 a-2=1
0.25×2 = 0 .5 a-3=0
0.5×2 = 1 .0 a-4=1 低位
所以, =
注:1、最先得到的整数是结果小数部分的最高位。
2、通常十进制小数不能准确地转换为等值的二进制小数(或其他R进制小数),一般将按要求精度保留若干位小数你,此时有转换误差存在。
3、二进制转换为八进制或十六进制数(转换方法:要把二进制数按3位或3位分组,然后写出其对应的八进制或十六进制数即可。注:整数部分分组时,从右边开始,分到最后一组时,不足位数,可在前补0。小数部分是右边加0。)
十进制、八进制、十六进制与二进制组合代码对应关系表
十进制 |
八进制 |
十六进制 |
二进制 |
0 |
0 |
0 |
0000 |
1 |
1 |
1 |
0001 |
2 |
2 |
2 |
0010 |
3 |
3 |
3 |
0011 |
4 |
4 |
4 |
0100 |
5 |
5 |
5 |
0101 |
6 |
6 |
6 |
0110 |
7 |
7 |
7 |
0111 |
8 |
10 |
8 |
1000 |
9 |
11 |
9 |
1001 |
10 |
12 |
A |
1010 |
11 |
13 |
B |
1011 |
12 |
14 |
C |
1100 |
13 |
15 |
D |
1101 |
14 |
16 |
E |
1110 |
15 |
17 |
F |
1111 |
16 |
20 |
10 |
10000 |
例1: →010 110 111=
→1011 0111=
例2: →011 100 110 101.110 110=
→0111 0011 0101.1101 1000=
4、八进制或十六进制数转换为二进制数
只要依次把八进制数或十六进制数的每一位分解为3位或4位二进制数即可,整数部分的高位0和小数部分的低位0可省去。
例1 =010 010 101→
例2: =1001 1111 1111 1000.0111 0110→
以上出自:http://jmxhzgx.blog.163.com/blog/static/165350136201052185950757/
2, 8, 10, 16进制转换.
//十进制转二进制
Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2));
//十进制转八进制
Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8));
//十进制转十六进制
Console.WriteLine("十进制166的十六进制表示: "+Convert.ToString(166, 16));
//二进制转十进制
Console.WriteLine("二进制 111101 的十进制表示: "+Convert.ToInt32("111101", 2));
//八进制转十进制
Console.WriteLine("八进制 44 的十进制表示: "+Convert.ToInt32("44", 8));
//十六进制转十进制
Console.WriteLine("十六进制 CC的十进制表示: "+Convert.ToInt32("CC", 16));
以上出自:http://www.cnblogs.com/index/archive/2007/08/22/865275.html
m进制转换为n进制-任意进制转换算法(百度面试题)2010-10-27 13:07 by 码农1946, 2636 visits, 收藏, 编辑
代码下载:进制转换代码
园子里有很多深藏不漏的高手,在这里聊这种基本问题是有点小儿科。不过本人只是想分享下自己的新的,代码,算法有不足之处,还请大家指正,共同进步。
这种题也是一道经典的面试题,主要考察进制转换细想,Coding质量等。
当我们把十进制转成二进制的时候,我们通过辗转相除,取余,逆置余数序列的过程得到新的进制的数。因此我们可以借助这种思想把M进制转成N进制的数。
如下是C的详细的实现方法
01 |
void m2n( int m, char * mNum, int n, char * nNum) |
02 |
{ |
03 |
int i = 0; |
04 |
char c, *p = nNum; |
05 |
06 |
//这是一个考察地方,是否能用最少乘法次数。 |
07 |
while (*mNum != '\0' ) |
08 |
i = i*m + *mNum++ - '0' ; |
09 |
|
10 |
//辗转取余 |
11 |
while (i) { |
12 |
*p++ = i % n + '0' ; |
13 |
i /= n; |
14 |
} |
15 |
*p-- = '\0' ; |
16 |
17 |
//逆置余数序列 |
18 |
while (p > nNum) { |
19 |
c = *p; |
20 |
*p-- = *nNum; |
21 |
*nNum++ = c; |
22 |
} |
23 |
} |
观察上面的代码,存在着众多的不足。例如,要对输入参数做检查,数值的大小收到int值最大值的限制等。不过好在一点,该算法的时间复杂度是O(n)的。
我们霹雳无敌的赵大叔又提供了一种用Java实现的通用的进制转换方法,即使Windows的计算器也转不了的大数,这个算法也可以转。算和上面的算法相比,他的基本思想不变,还是辗转除,但是用了字符串做大数相除,很不错的创新点,赞一个。代码如下:
01 |
package test; |
02 |
03 |
/** |
04 |
* 功能:将一个数从M进制转换成N进制 |
05 |
* MValue:M进制数的字符串表示方法 |
06 |
* Shang:保存中间运算结果 |
07 |
* M:M进制 |
08 |
* N:N进制 |
09 |
*/ |
10 |
public class M2N { |
11 |
// 在这里对输入赋值 |
12 |
public static String MValue = "1231412423534674574757" ; |
13 |
public static String Shang = null ; |
14 |
public static int M = 10 ; |
15 |
public static int N = 8 ; |
16 |
17 |
public static void main(String[] args) { |
18 |
String nValue = "" ; |
19 |
Shang = MValue; |
20 |
while (Shang.length() > 0 ) { |
21 |
nValue = qiuyu(Shang) + nValue; |
22 |
} |
23 |
System.out.println(nValue); |
24 |
} |
25 |
26 |
/** |
27 |
* 功能:对给定的M进制字符串对n求余。 |
28 |
* |
29 |
* @param MTempValue |
30 |
* @param m |
31 |
* @param n |
32 |
* @return |
33 |
*/ |
34 |
public static String qiuyu(String MTempValue) { |
35 |
Shang = "" ; |
36 |
int temp = 0 ; |
37 |
while (MTempValue.length() > 0 ) { |
38 |
int t = getIntFromStr(MTempValue.substring( 0 , 1 )); |
39 |
MTempValue = MTempValue.substring( 1 ); |
40 |
temp = temp * M + t; |
41 |
Shang += getStrFromInt(temp / N); |
42 |
temp = temp % N; |
43 |
} |
44 |
while (Shang.length() > 0 && Shang.charAt( 0 ) == '0' ){ |
45 |
Shang = Shang.substring( 1 ); |
46 |
} |
47 |
return getStrFromInt(temp); |
48 |
} |
49 |
50 |
public static int getIntFromStr(String str){ |
51 |
return str.charAt( 0 ) <= '9' && str.charAt( 0 ) >= '0' ? |
52 |
str.charAt( 0 ) - '0' : str.charAt( 0 ) - 'a' + 10 ; |
53 |
} |
54 |
55 |
public static String getStrFromInt( int value){ |
56 |
String result = null ; |
57 |
if (value>= 0 && value<= 9 ) |
58 |
result = String.valueOf(( char )( '0' + value)); |
59 |
else if (vlaue > 9 && value < 36 ) |
60 |
{ |
61 |
result = String.valueOf(( char )( 'a' + value - 10 )); |
62 |
} |
63 |
else |
64 |
{ |
65 |
result = "-1" ; // 出错误了 |
66 |
} |
67 |
return result; |
68 |
} |
69 |
} |
赵大叔的算法好了不少,除了参数检查,大小写之外都很好。值得我们借鉴。
以上出自:http://www.cnblogs.com/pkuoliver/archive/2010/10/27/convert-m-number-to-n-number.html
数的按权展开
数的按权展开
任何一个数值,都是各位数字本身的值与其权之积的总和
对任何一个10进制的数来讲,均可表示为:
-m
S(10) =ΣKi10i = Kn×10n + Kn-1×10n-1 +…+ K0×100 + K-m×10-m
i=n
这里10为进位制的基数
Ki为小于基数的系数(0,1,2,...,9)
m,n为正整数
我能理解是比如:123.45=1X10的2次方+2X10的1次方+3X10的0次方 点 4X10的负1次方+5X10的负2次方,我但是不理解:
-m
S(10) =ΣKi10i = Kn×10n + Kn-1×10n-1 +…+ K0×100 + K-m×10-m
i=n
这个公式;如何读取这个公式。
日期:2011-4-2
刘勇 13:52:26
-m是小数部分,比如0.1是1×10的负一次方,一是小数的第一位。m第几位小数
刘勇 13:54:26
比如0.03=0.3x10的负2次方,3是小数的第2位,
以上出自:http://hi.baidu.com/gao_xiubin/blog/item/64a49bfd606ea9374f4aea97.html