二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。
20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,因为数字计算机只能识别和处理由‘0’.‘1’符号串组成的代码。其运算模式正是二进制。19世纪爱尔兰逻辑学家乔治布尔对逻辑命题的思考过程转化为对符号"0''.''1''的某种代数演算,二进制是逢2进位的进位制。0、1是基本算符。因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。
十进制 | 二进制 | |
---|---|---|
基本数字 | 10个:0~9 | 2个:0,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 |
- 二进制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 = 12 即 3*2*2 |
>> | 右移 | 3>>1 = 1 即 3/2=1 |
>>> | 无符号右移 | 3>>>1 = 1 即 3/2=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中的指定位。
只要有一个为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
。
两个相应位为“异”(值不同),则该位结果为1
,否则为0
。
0^0=0
; 0^1=1
; 1^0=1
; 1^1=0
例:51^5
即 0011 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;
对一个二进制数按位取反,即将0
变1
,1
变0
。
~1 = 0
; ~0 = 1
将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)
2 << 1 = 4;
若左移时舍弃的高位不包含1
,则每左移一位,相当于该数乘以2
。
-14 (即二进制 1111 0010) << 2 = 1100 1000
(详见结尾"-14左移2位")
11 (1011) << 2 = 44
11 (00000000 00000000 00000000 00001011)
(32bit)
将一个数的各二进制位全部右移若干位,正数左补0
,负数左补1
,右边丢弃。操作数每右移一位,相当于该数除以2
。
左补0
还是补1
,得看被移数是正数还是负数。
例:
1 = 4 >> 2
-14 (1111 0010) >> 2 = -4 (1111 1100)
各个位向右移指定的位数。右移后左边空出的位用0
来填充。移出右边的位被丢弃。
例:
-14 >>> 2
即:
-14 (11111111 11111111 11111111 11110010) >>> 2
= 00111111 11111111 11111111 11111100
= 1073741820
一个整数按照绝对值大小转换成的二进制数称为原码。
例:00000000 00000000 00000000 00001110
是14的原码。
将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
例:将 00000000 00000000 00000000 00001110
每一位取反,
得:11111111 11111111 11111111 11110001
注意:11111111 11111111 11111111 11110001
和 00000000 00000000 00000000 00001110
互为反码。
反码加1
称为补码。
例:11111111 11111111 11111111 11110001 + 1
= 11111111 11111111 11111111 11110010
-14 (11111111 1111111 11111111 11110010) << 2
= (11111111 11111111 11111111 11001000)
= ?
分析:只需要求出该补码的原码对应的正值,然后取相反数。
-
补码减
1
得到反码11000111
(前24位为1,此处省略) -
补码取反得到原码(即该负数的正值)
00111000
(前24位为0,此处省略) -
计算正值 (按照二-十进制转换规则,正值为56)
-
取相反数 (结果-56)
笔记作者: capricorncd
主页:https://github.com/capricorncd
原讲师:tuohuangs