1.1 进制与字节
题单介绍
数学中常用的十进制的定义:逢十进一
即9+1=10。在十进制下的数$123=1*10^2+2*10^1+3*10^0$
以此类推,X进制下逢X进一。在X进制下的数$123=1*X^2+2*X^1+3*X^0$
在计算机中,由于最小单位只有高电位和低电位两种可能,即1和0。所以绝大部分计算机都是二进制的。那么运算时也都是在二进制下进行运算。
但由于二进制下表示一个数会导致这个数写出来会很长,为了缩短长度,我们还常用8进制和16进制表示一个数。(不用十进制是因为二进制与十进制转换比较慢)
那么一个数怎么在二进制与十进制之间转换呢?
若果要让二进制数1101转换为十进制的话,我们可以使用进制的定义来转换:
$1101=1*2^3+1*2^2+0*2^1+1*2^0=8+4+1=13$
若果要让十进制数1101转换为二进制的话,我们可以先判断这个数在二进制下的最低位是多少,再判断上面的位是什么:
根据二进制的定义,若一个二进制数有n位,那么可以表示为$a_{n-1}a_{n-2}a_{n-3}...a_{2}a_{1}a_{0}$,每一位$a_i$都可以是0或者1。那么他在十进制下的值为$a_{n-1}*2^{n-1}+a_{n-2}*2^{n-2}+a_{n-3}*2^{n-3}+...+a_{2}*2^{2}+a_{1}*2^{1}+a_{0}*2^{0}$
很显然,减去$a_0$后这个数一定是2的倍数。若这个数是奇数,那么$a_0=1$,否则$a_0=0$。
得到最低位$a_0$的值后,将原来的数除以2。得到的数等于$a_{n-1}*2^{n-2}+a_{n-2}*2^{n-3}+a_{n-3}*2^{n-4}+...+a_{2}*2^{1}+a_{1}*2^{0}$
也就是二进制下的$a_{n-1}a_{n-2}a_{n-3}...a_{2}a_{1}$。那么$a_1$的求法与$a_0$一样。
一直求最后一位数,直到二进制的每一位数的值都求完了为止。
或者说,每一次除以二,把余数按顺序记下来,直到数被除为0。然后把余数从后往前写一边,就是这个数的二进制了。
比如十进制数123转化为二进制:
```
123 … 1
61 … 1
30 … 0
15 … 1
7 … 1
3 … 1
1 … 1
0
那么123对应的二进制就是1111011
```
十进制小数转化为二进制也是类似的方法:每次将其乘2,把整数部分提取出来。直到为0为止。(可能会出现无法停止的情况,那么就是无限循环小数)
比如十进制小数0.625转化为二进制:
```
0.625 … 0
1.25 … 1
0.5 … 0
1 … 1
那么0.625对应的二进制就是0.101
```
二进制与八进制的互相转换:
二进制数11010011101转化为八进制时,先将其分割成三位一组(不足则前面补0)011 010 011 101。对于每一组将其转化为八进制,再连起来,变成3235。
八进制转化为二进制时也是一样,先将每位数字转化为3位的二进制,再将他们连起来。比如八进制数1234转化为二进制后,为 001 010 011 100,即1010011100。
二进制与十六进制的转化方式与八进制类似,把3位1组改为4位1组即可。
字节:在计算机中8个二进制位为一个字节。字节是计算机存储的基本单位。
在c语言中,整数常量可以用十进制、八进制和十六进制来表示。八进制要在数字前加0,十六进制要在数字前加0x。十六进制里的数字若大于9,则从小到大用字母ABCDEF表示。
比如十进制的123在c语言里有三种表示法:
```
123 (十进制)
0173 (八进制)
0x7B (十六进制)
```
[习题](https://www.luogu.com.cn/paste/rw99xjea)