二进制(binary)是在数学和数字电路中以2为基数的记数系统,这一系统中,通常用两个不同的符号0和1来表示数值。
基本概念
位(bit):二进制数据中的基本单位,每一位只能是0或1。在计算机科学中,一个位通常被称为一个比特(Binary digit的缩写)。
字节(byte):由8个位组成,是计算机中常用的数据单位。一个字节可以表示256种不同的状态(因为2^8=256)。
二进制的特点
基数为2:二进制的基数是2,这意味着在二进制系统中,每一位的数值只能是0或1。
进位规则:二进制采用“逢二进一”的进位规则,即当某一位的数值达到2时,需要向高位进位,并将该位重置为0。
借位规则:在二进制中,当需要从一个较小的数中减去一个较大的数时,会发生借位。借位规则是“借一当二”,即从高位借1位来当作2使用。
//举例
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001举个例子,将十进制数23转换为二进制数:23 ÷ 2 = 11 余 1(记录1,这是最低位)
11 ÷ 2 = 5 余 1(记录1,这是次低位)
5 ÷ 2 = 2 余 1(记录1,这是更高位)
2 ÷ 2 = 1 余 0(记录0,这是再高一位)
1 ÷ 2 = 0 余 1(记录1,这是最高位)所以23就是10111
八进制
八进制(Octal)是一种以8为基数的计数系统,满8近一。
0 -> 00
1 -> 01
2 -> 02
3 -> 03
4 -> 04
5 -> 05
6 -> 06
7 -> 07
8 -> 10
9 -> 11
10 -> 12
11 -> 13
12 -> 14
13 -> 15
14 -> 16
15 -> 17
16 -> 20
16进制
16进制(简写为hex或下标16)是一种数学中常用的数制(记数的方法),它用16个符号来表示数值。这些符号分别是:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。其中,A到F分别表示10到15。
16进制数的表示形式为:
0x或0X开头(在C、C++、Java等编程语言中常用)
例如:0x1A3F、0XFF1C等
进制的转换
比如我们计算1011:
从二进制数的最右边(即最低位)开始,将每一位上的数字乘以2的次方。
最右边的位(第1位)是1乘以2的0次方
得到1。
接着是(第2位)1乘以2的1次方
得到2。
然后是(第3位)0乘以2的2次方
得到0。
最后是(第4位)1乘以2的3次方
得到8。1+2+0+8=11
十进制转换为二进制可以采用“除2取余法”
整数部分的转换
将十进制的数字一直除2,得到的商和余数,直到商为0时为止。
将每次得到的余数记录下来,按从低位到高位的顺序排列起来。
//将53转成二进制
第一次除法:用51除以2,得到商26和余数1。
第二次除法:用2去除26,得到商13和余数0。
第三次除法:用2去除13,得到商6和余数1。
第四次除法:用2去除6,得到商3和余数0。
第五次除法:用2去除3,得到商1和余数1。
第六次除法:用2去除1,得到商0和余数1。
组合余数:
将所有记录的余数按从低位到高位的顺序排列起来,表示为110101。
小数部分的转换
乘法运算:
用2乘以十进制小数,然后取整数部分。
剩下的小数部分继续乘以2,然后取整数部分。
如此进行,直到小数部分为零为止(如果永远不能为零,则按照要求保留多少位小数)。
记录整数部分:
在整个乘法运算过程中,将每次得到的整数部分记录下来。
注意整数部分的顺序,先得到的整数部分是二进制数的低位有效位,后得到的整数部分是二进制数的高位有效位。
组合结果:
将所有记录的整数部分按从低位到高位的顺序排列起来(小数点不变),并加上小数点,就得到了该十进制小数的二进制表示(如果要求保留有限位小数)。
以十进制数23.625为例:
整数部分23的转换:
23 ÷ 2 = 11 余 1
11 ÷ 2 = 5 余 1
5 ÷ 2 = 2 余 1
2 ÷ 2 = 1 余 0
1 ÷ 2 = 0 余 1
将余数按从低位到高位的顺序排列:10011小数部分0.625的转换:
0.625 × 2 = 1.25(取整数部分1)
0.25 × 2 = 0.5(取整数部分0,注意这里我们只取到小数点后第一位,因为原数只有两位小数)
0.5 × 2 = 1.0(取整数部分1,这里已经足够精确到原数的位数)
将整数部分按从低位到高位的顺序排列(并加上小数点):.101
因此,小数部分0.625的二进制表示为0.101(这里我们只保留了三位小数进行演示,实际上可以根据需要保留更多位)。
组合结果:
将整数部分和小数部分的二进制表示组合起来:10111.101
因此,十进制数23.625的二进制表示为10111.101。
原码反码和补码
原码、反码和补码是计算机中用于表示有符号整数(二进制编码)的三种编码方式。
原码
- 定义:原码是一种最简单的机器数表示法,最高位为符号位,用以表示数值的正负(通常用 0 表示正数,1 表示负数),其余位表示数值的绝对值。
- 示例:假设用 8 位二进制来表示整数。
- 优缺点:原码的优点是直观易懂,与真值的转换较为简单;缺点是进行加减运算时规则复杂,需要先判断符号位和数值大小,再进行相应操作。
反码
- 定义:反码的表示规则根据数的正负有所不同。正数的反码与原码相同;负数的反码是在原码的基础上,符号位不变,其余位按位取反(即 0 变为 1,1 变为 0)。
- 示例:同样以 8 位二进制为例。
- 正数 +10 的原码是
00001010
,其反码也是00001010
。 - 负数 -10 的原码是
10001010
,则其反码是11110101
(符号位 1 不变,其余位取反)。
- 正数 +10 的原码是
- 优缺点:反码在一定程度上简化了计算机的运算,但仍然存在 0 的表示不唯一的问题(有 +0 和 -0 之分),并且在运算时还是需要额外处理。
补码
- 定义:补码的表示规则同样因数的正负而异。正数的补码与原码、反码相同;负数的补码是在反码的基础上加 1。
- 示例:还是以 8 位二进制表示。
- 正数 +10 的原码、反码和补码都是
00001010
。 - 负数 -10 的原码是
10001010
,反码是11110101
,补码则是11110110
(反码11110101
加 1)。
- 正数 +10 的原码、反码和补码都是
- 优缺点:补码解决了 0 的表示不唯一的问题,并且在计算机中可以将减法运算转化为加法运算,大大简化了计算机的运算器设计,提高了运算效率,因此在计算机系统中得到了广泛应用。
总结
原码直观但运算复杂,反码是过渡形式,而补码则解决了原码和反码存在的问题,使得计算机的运算更加高效和统一。