Skip to content

Latest commit

 

History

History
297 lines (177 loc) · 8.28 KB

binary.md

File metadata and controls

297 lines (177 loc) · 8.28 KB

二进制 Binary

二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。

20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,因为数字计算机只能识别和处理由‘0’.‘1’符号串组成的代码。其运算模式正是二进制。19世纪爱尔兰逻辑学家乔治布尔对逻辑命题的思考过程转化为对符号"0''.''1''的某种代数演算,二进制是逢2进位的进位制。0、1是基本算符。因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。

# 二进制的相关概念

十进制 二进制
基本数字 10个:0~9 2个:0,1
进位规则 十进一 二进一
位权 一个数码在不同的位置上所代表的值不同 (同左)

例子

  1. 十进制电话 8329666
十进制 8 3 2 9 6
二进制 1000 0011 0010 1001 0110
1*23 1*21+1*20 1*21 1*23+1*20 1*22+1*21
  1. 二进制111001的表示法用57进行说明
  • 采用科学计数法,按权展开
第6位 第5位 第4位 第3位 第2位 第1位 求和
1 1 1 0 0 1 -
1*26-1 1*25-1 1*24-1 0*23-1 0*22-1 1*21-1 -
32 16 8 0 0 1 = 57
二进制位 二进制码 计算方法 十进制结果
第6位 1 1*26-1 32
第5位 1 1*25-1 16
第4位 1 1*24-1 8
第3位 0 0*23-1 0
第2位 0 0*22-1 0
第1位 1 1*21-1 1
- - - 57
  • 十进制转换为二进制:短除2
除法 余数/结果
57 / 2 28 1
28 / 2 14 0
14 / 2 7 0
7 / 2 3 1
3 / 2 1 1
1 / 2 0 1

将余数从下往上拼接:111001

# 适合计算机的进制

  • 二进制

    计算机内部用二进制:运算简单,简化了计算机结构

  • 其他进制

    八进制:适用于12位和36位计算机系统,标志的开头用0表示,用0~7的数字表示。

    十六进制:用0~9,A-F表示,表达长度短,变得更常用。标志开头用0x表示。

# 常用进制的换算

十进制 二进制 八进制 十六进制
0 0000 0 0
1 0001 1 1
2 0010 2 2
3 0011 3 3
4 0100 4 4
5 0101 5 5
6 0110 6 6
7 0111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
  • 八进制换算
除法 余数/结果
8 / 8 1 0
1 / 8 0 1

将余数从下往上拼接:10,所以十进制8对应的八进制为10

# 二进制的位运算

二进制的位运算,即对二进制的位进行操作。

运算符 描述 实例
& 与运算 6 & 3 = 2
| 或运算 6 | 3 = 7
^ 异或运算 6 ^ 3 = 5
~ 反码 ~6 = -7
<< 左移 3<<2 = 123*2*2
>> 右移 3>>1 = 13/2=1
>>> 无符号右移 3>>>1 = 13/2=1
  • 优点

    特定情况下,二进制计算方便,速度快,被支持面广

    如果用算数方法,速度慢,逻辑复杂

1. 按位与 &

两位全为1,结果才为1

0&0=0; 0&1=0; 1&0=0; 1&1=1

例子:51 & 5 = 0000 0001 = 1

51 : 0 0 1 1 0 0 1 1
5 : 0 0 0 0 0 1 0 1
结果 : 0 0 0 0 0 0 0 1

位运算的特殊用法:

(1) 清零。如果想将一个单元清零,即使其全部二级制位为0,只要与一个各位都为0的数值相与,结果为零

(2) 取一个数中指定位

例:设 X = 1010 1110,取X低4位,用X & 0000 1111 = 0000 1110即可得到。

方法

找一个数,对应X要取得位,该数的对应位为1,其余位为0,此数与X进行与运算可以得到X中的指定位。

2. 按位或 |

只要有一个为1,其结果就为1

0|0=0; 0|1=1; 1|0=1; 1|1=1

或运算的特殊用法:

常用来对一个数据的某些位置1

例:将 X = 1010 0000的低4位置1,用X | 0000 1111 = 1010 1111即可得到。

方法

找到一个数,对应X要置1的位,该数的对应位为1,其余位为0。此数与X相或,可使X中的某些位置1

3. 异或运算 ^

两个相应位为“异”(值不同),则该位结果为1,否则为0

0^0=0; 0^1=1; 1^0=1; 1^1=0

例:51^50011 0011 ^ 0000 0101 = 0011 0110,因此51^5=54

异或运算的特殊用途:

(1) 使特定位翻转。找一个数,对应X要翻转的各位,该数的对应位为1,其余位为0,此数与X对应位异或即可。

例:X = 1010 1110,使X低4位翻转,用X ^ 0000 1111 = 1010 0001即可得到。

(2) 与0相异或,保留原值。

例:X ^ 0000 0000 = 1010 1110

(3) 两个变量交换值的方法

# 借助第三个变量来实现

C = A; A = B; B = C;

# 利用加减法实现两个变量的交换

A = A + B; B = A - B; A = A - B;

# 用位异或运算来实现,也是效率最高

原理: 利用一个数异或本身等于0异或运算符合交换率

A = A ^ B; B = A ^ B; A = A ^ B;

4. 取反运算 ~

对一个二进制数按位取反,即将0110

~1 = 0; ~0 = 1

5. 左移运算 <<

将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)

2 << 1 = 4;

若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2

-14 (即二进制 1111 0010) << 2 = 1100 1000 (详见结尾"-14左移2位")

11 (1011) << 2 = 44

11 (00000000 00000000 00000000 00001011) (32bit)

6. 右移运算 >>

将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。操作数每右移一位,相当于该数除以2

左补0还是补1,得看被移数是正数还是负数。

例:

1 = 4 >> 2

-14 (1111 0010) >> 2 = -4 (1111 1100)

7. 无符号右移运算 >>>

各个位向右移指定的位数。右移后左边空出的位用0来填充。移出右边的位被丢弃。

例:

-14 >>> 2

即:

-14 (11111111 11111111 11111111 11110010) >>> 2

= 00111111 11111111 11111111 11111100

= 1073741820

# 负数以其正值的补码形式表示

1. 原码

一个整数按照绝对值大小转换成的二进制数称为原码

例:00000000 00000000 00000000 00001110是14的原码。

2. 反码

将二进制数按位取反,所得的新二进制数称为原二进制数的反码

例:将 00000000 00000000 00000000 00001110 每一位取反,

得:11111111 11111111 11111111 11110001

注意:11111111 11111111 11111111 11110001

00000000 00000000 00000000 00001110互为反码。

3. 补码

反码加1称为补码

例:11111111 11111111 11111111 11110001 + 1

= 11111111 11111111 11111111 11110010

4. 求-14左移2位

-14 (11111111 1111111 11111111 11110010) << 2

= (11111111 11111111 11111111 11001000)

= ?

分析:只需要求出该补码的原码对应的正值,然后取相反数。

  1. 补码减1得到反码11000111 (前24位为1,此处省略)

  2. 补码取反得到原码(即该负数的正值)00111000 (前24位为0,此处省略)

  3. 计算正值 (按照二-十进制转换规则,正值为56)

  4. 取相反数 (结果-56)

# 备注

笔记作者: capricorncd

主页:https://github.com/capricorncd

原讲师:tuohuangs

出处:https://www.imooc.com/learn/195