数制的转换(二进制、八进制、十进制、十六进制)

2014-11-24 00:41:30 · 作者: · 浏览: 0

由于计算机内只有高低电平,只能代表0和1两种状态,就此产生了二进制,而人们习惯的数字是十进制。所以就存在十进制与二进制之间的转换,但是由于二进制表示数据起来不方面(特别是当数值比较大时),十进制转换为二进制又比较麻烦,就产生了八进制、十六进制

进制对照表

\


2进制与八进制、十六进制转换十分容易

每个进制都是的每一位都是有位权的< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+yOejujEwMDGjqLb+vfjWxqOpICAgICAgMl4zKjEgJiM0MzsgMl4yKjAgJiM0MzsgMl4xKjAgJiM0MzsgMl4wKjEgPSA5PC9wPgo8cD4gICAgMTAwMaOosMu9+NbGo6kgICAgICA4XjMqMSAmIzQzOyA4XjIqMCAmIzQzOyA4XjEqMCAmIzQzOyA4XjAqMSA9IDUxMzwvcD4KPHA+ICAgIDEwMDGjqMquvfjWxqOpICAgICAgMTBeMyoxICYjNDM7IDEwXjIqMCAmIzQzOyAxMF4xKjAgJiM0MzsgMTBeMCoxID0gMTAwMTwvcD4KPHA+ICAgIDEwMDGjqMquwfm9+NbGo6kgICAgMTZeMyoxICYjNDM7IDE2XjIqMCAmIzQzOyAxNl4xKjAgJiM0MzsgMTZeMCoxID0gNDA5NzwvcD4KPHA+0tTJz7XEtrzKx7u7y+O1vcquvfjWxrXEvMbL473hufuho7/JvPvNrNK7uPbK/dfWyOe5+86qsrvNrMr91sa087bgyv3H6b/2z8Kx7cq+tcTK/SYjMjA1NDA7tPPQocrHsrvNrLXEPC9wPgo8cD48cHJlIGNsYXNzPQ=="brush:java;">#include #define Binary 0b100 #define Octal 0100 #define Decimal 100 #define Hex 0x100 int main() { printf("the Binary %d\n", Binary); printf("the Octal %d\n", Octal); printf("the Decimal %d\n", Decimal); printf("the Hex %d\n", Hex); return 0; }

运行结果:

the Binary 4
the Octal 64
the Decimal 100
the Hex 256
C语言中默认数值是十进制,如果一个数值是0开头的就是八进制,如果以0x或者0X开头就是十六进制

同样可以通过printf指定不同的格式打印相应的进制

%d %u有无符号十进制打印

%o 八进制打印

%x %X 十六进制打印,两者区别x约定使用abcedf,而X预定使用ABCDEF


二进制与八进制/十六进制转换比较简单,因为分别是2的3次方,4次方

比如:

1100(二进制) -----> 001100 ----> 14(八进制)

1100(二进制) -----> 1100 ----> c (十六进制)

反之也是一样


十进制与二进制转换

十进制 ------> 二进制

这里可以用十六进制过度。16 ,256 ,4096 ,65536 ,1048576 ,16777216 ...(分别是就是16^1 ,16^2 ,16^3……)
先找第一个比要转的那个数小的数,然后用这个数除那个要转的数,得到的商就是那个位的数(位数就是是指数),然后找到第一个比余数小的数,)

如:

9999 ----> 二进制?

9999/4096 商为2,说明十六进制的第3位为2,余数为1807。

1807/256 商为7,说明十六进制的第2位为5,余数为15。

后面的直接是十六进制第一位为0,第零位为15

9999(十进制) ----> 270f(十六进制) -----> 0010 0111 0000 1111(二进制)

这样就比9999这么大的数一直除2快许多了

二进制转十进制比较简单,如前面所说的按位权乘加就可以了。十进制转八进制、十六进制和上面的一样,只是省去了转换为二进制的步骤