村长

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、不同进制有共同的特点:

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进制转换.

小小的mark一下, 免得以后忘记, 这东西还挺有用的哈..


//十进制转二进制
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

数的按权展开

2011-04-03 00:13

数的按权展开
任何一个数值,都是各位数字本身的值与其权之积的总和
对任何一个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

posted on 2011-09-06 15:08  Say No  阅读(1082)  评论(0编辑  收藏  举报