「学习笔记」进制转换
前言
学习下c语言以及相关的基础,最近会更新很基础的知识
进制
常用的进制分别为2进制、10进制(生活常用)、16进制
进制间的关系表
二进制 | 十进制 | 十六进制 |
---|---|---|
0 | 0 | 0 |
1 | 1 | 1 |
10 | 2 | 2 |
11 | 3 | 3 |
100 | 4 | 4 |
101 | 5 | 5 |
110 | 6 | 6 |
111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | 10 | A |
1011 | 11 | B |
1100 | 12 | C |
1101 | 13 | D |
1110 | 14 | E |
1111 | 15 | F |
10000 | 16 | 10 |
10001 | 17 | 11 |
... | ... | ... |
11111111 | 255 | FF |
进制间的转换
二进制转十进制
1.简单方法:适用于所有位上均为1的情况
公式: result = 2^n -1
说明:result为十进制结果,n为1的个数
读作:2的n次方减1
例:1111有4个1,那么就有 2^4 - 1 = 16 -1 = 15
2.无符号按位加权:适用于无符号情况(c语言中int型默认有符号)
二进制8位数,从右往左从0~7写位权 ![](https://img2018.cnblogs.com/blog/1149398/201810/1149398-20181003120743309-1040287508.png)
公式:`result = n1x2^7 + n2x2^6 + n3x2^5 + n4x2^4 + n5x2^3 + n6x2^2 + n7x2^1 + n8x2^0`
说明:result为结果,n1~n8分别为二进制数第1到第8位数,2的位权次方
读作: 每个二进制数位与2的位权次方之和
举例:111的前五位均为0,那么乘后也为0,2的0次方为1
`1x2^2 + 1x2^1 + 1x2^0 = 4+2+1 = 7`
3.有符号按位加权:负数,符号位为1;非负数符号位为0
**其中符号位为0(正数)的情况下与上述方法完全相同。**
**符号位为1的时候(负数),在计算第1位前乘-1**
公式:`result = -n1x2^7 + n2x2^6 + n3x2^5 + n4x2^4 + n5x2^3 + n6x2^2 + n7x2^1 + n8x2^0`
举例:有符号10000000转十进制,首先是有符号并且符号位为1,说明是负数,则有
`-1x2^7 + 0x2^6 + 0x2^5 + 0x2^4 + 0x2^3 + 0x2^2 + 0x2^1 + 0x2^0 = -128`
十进制转二进制
取余法
- 将十进制数进行多次除二,直到商为0,记录每次是否被整除,整除记0,不整除记1
- 将记下的数由下至上即可得到二进制数
举例:十进制18,第一次18/2整除记0,第二次9/2不整除记1,第三次4/2四次整除记0,第四次2/2整除记0,最后一次1/2不整除记1,倒序就是10010
2进制转16进制
将2进制数从右往左数,每4个一组,通过查表分别换算成16进制数即可。
16进制转2进制
将16进制每一位当作一个十进制都转成4位长度的二进制,最终组合到一起。当16进制位是A ~ F,转换成10进制,A ~ F就是10 ~ 15。
举个例子:16DB
1转成0001
6转成0110
D对应10进制的13,转成1101
B对应10进制的11,转成1011
组合起来就是 0001 0110 1101 1011
Linux上转换进制
- 使用bc命令,需要安装bc
- 命令:
echo "obase=x;ibase=y;z" | bc
- 说明:其中obase中的x为要转换成的进制用数字表示, ibase的y为当前输入进制数字,z为待转换数
- 命令:
- 使用
echo $((x#y))
二进制转换十进制- 说明 x为进制数,y为输入数
本文整理自小甲鱼的论坛整理而来,原贴见链接