blog
blog copied to clipboard
二进制
二进制是计算技术中广泛采用的一种数制。
二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”(十进制加减法是“逢十进一”、“借一当十”)。
数字电子电路中,逻辑门的实现直接应用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。
每个数字称为一个比特(二进制位)。计算机中的二进制是一个非常微小的开关,用“开”来表示 1 ,“关”来表示 0 。
附:比特或称位元( bit ) → 字节( byte ) → 字符
比特( bit ):一个二进制数据 0 或 1,是 1 bit 。
字节( byte ):
- 存储空间的基本计量单位,如: MySQL 中定义 VARCHAR(45) 即是指 45个 byte 。
- 汉字输入状态下,默认为全角输入方式,标点符号占 2 byte 。
- 英文输入状态下,默认为半角输入方式,标点符号占 1 byte 。
字符:ASCII 编码中:1 字母(标准字符) = 1 byte = 8 bit ,1 汉字 = 2 byte = 16 bit。
进制转换
应用:
IP 地址有 32 位,由 4 个 8 位的二进制数组成,如 11000000 10101000 00000000 00000001
。
由于二进制数不便记忆而且可读性较差,所以通常会转换成十进制数表示,如以上二进制的 IP 地址转换成十进制表示为 192.168.0.1
( 1 byte = 8 bit )。
十进制转二进制
- 十进制整数转二进制数:除以2取余,逆序排列,高位补零(除二取余法)
- 十进制小数转二进制数:乘2取整,顺序排列(乘2取整法)
示例:59.25(10) = 111011.01(2)
整数部分,把十进制转成二进制一直分解至商数为0。读余数 从下读到上 ,即是二进制的整数部分数字。 小数部分,则用其乘2,取其整数部分的结果,再用计算后的小数部分依此重复计算,算到小数部分全为0为止,之后读所有计算后整数部分的数字,从上读到下。
整数部分: 59 ÷ 2 = 29 ... 1 29 ÷ 2 = 14 ... 1 14 ÷ 2 = 7 ... 0 7 ÷ 2 = 3 ... 1 3 ÷ 2 = 1 ... 1 1 ÷ 2 = 0 ... 1
decimal: 59 -> binary(8 digits): 00111011
小数部分: 0.25 × 2 = 0.5 0.50 × 2 = 1.0
Divide by the base 2 to get the digits from the remainders:
https://www.rapidtables.com/convert/number/decimal-to-binary.html?x=59
Division by 2 | Quotient | Remainder(Digit) | Bit # |
---|---|---|---|
(59)/2 | 29 | 1 | 0 |
(29)/2 | 14 | 1 | 1 |
(14)/2 | 7 | 0 | 2 |
(7)/2 | 3 | 1 | 3 |
(3)/2 | 1 | 1 | 4 |
(1)/2 | 0 | 1 | 5 |
(59)10= (111011)2
二进制转十进制
任意进制到十进制的转换原理:系数*基数的权次幂相加:
- 系数:就是每一位上的数据
- 基数:X 进制,基数就是 X
- 权:在右边,从 0 开始编号,对应位上的编号即为该位的权
- 结果:把系数 × 基数的权次幂相加即可
二进制数转十进制数方法:按权展开求和: (整数)个位上的数字的次数是0,十位上的数字的次数是1,......,依次递增, (小数)而十分位的数字的次数是-1,百分位上数字的次数是-2,......,依次递减。
注意:不是任何一个十进制小数都能转换成有限位的二进制数。
100101(2) = [ ( 1 ) × 25 ] + [ ( 0 ) × 24 ] + [ ( 0 ) × 23 ] + [ ( 1 ) × 22 ] + [ ( 0 ) ×21 ] + [ ( 1 ) ×20 ]
100101(2) = [ 1 × 32 ] + [ 0 × 16 ] + [ 0 × 8 ] + [ 1 × 4 ] + [ 0 × 2 ] + [ 1 × 1 ]
100101(2) = 37(10)
图表法 (Convert Decimal, Binary, Hexadecimal)
Convert the binary numbers: 01001111 to decimal numbers and hexadecimal numbers.
binary numbers: 01001111
= decimal number: 79. Verify: 0×27+1×26+0×25+0×24+1×23+1×22+1×21+1×20=0+64+0+0+8+4+2+1=79
= hexadecimal number: 4F. Verify: 4F=4×161+15×160=64+15=79
27 =128 | 26 =64 | 25 =32 | 24 =16 | 23 =8 | 22 =4 | 21 =2 | 20 =1 | |
---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | Binary |
\ | 64 | \ | \ | 8 | 4 | 2 | 1 | Decimal: 64+8+4+2+1=79 |
8 | 4 | 2 | 1 | 8 | 4 | 2 | 1 | |
\ | 4 | \ | \ | 8 | 4 | 2 | 1 | Hex: 4, 8++4+2+1=>4F |
Convert Decimal: 177 to Binary and Hexadecimal.
Decimal: 177
=Binary: 10110001. Verify: 1×27+0×26+1×25+1×24+0×23+0×22+0×21+1×20=128+0+32+16+0+0+0+1=177
=Hexadecimal: B1. Verify: B1=11×161+1×160=176+1=177
27 =128 | 26 =64 | 25 =32 | 24 =16 | 23 =8 | 22 =4 | 21 =2 | 20 =1 | |
---|---|---|---|---|---|---|---|---|
1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | Binary: 10110001 |
177>128 | 177-128=49<64 | 49>32 | 49-32=17>16 | 17-16=1<8 | 1<4 | 1<2 | 1=1 | |
8 | 4 | 2 | 1 | 8 | 4 | 2 | 1 | |
8 | \ | 2 | 1 | \ | \ | \ | 1 | Hex: 8+2+1, 1=> B1 |
附:数表( 0 ~ 32 十进制数字转二进制)
Python 二进制转十进制:使用 Python 内置函数 int()
。 Integer (十进制)整数。
>>> # 二进制转十进制
... int('11111111', 2)
255
注意:上面的二进制数不要忘记加引号,该二进制数表示为一个字符串。 Python 中除了整型 int ,其它进制的只能用字符串来表示。
附:其它进制转十进制:
>>> # 八进制转十进制
... int('04', 8)
4
>>> # 十六进制转十进制
... int('0x4', 16)
4
Python 十进制转二进制:使用 Python 内置函数 bin()
。Binary 二进制。
>>> # 十进制转二进制
... bin(int('255', 10))
'0b11111111'
>>> # 或者直接输入一个十进制数:Python 中除了整型 int ,其它进制的只能用字符串来表示
... bin(255)
'0b11111111'
注意: 0b
表示 binary 二进制的意思。
附:十进制转其它进制:
>>> # 十进制转八进制
... oct(int('4', 10))
'04'
>>> # 或者直接输入一个十进制数:Python 中除了整型 int ,其它进制的只能用字符串来表示
... oct(4)
'04'
>>>
>>> # 十进制转十六进制
... hex(int('4', 10))
'0x4'
>>> # 或者直接输入一个十进制数:Python 中除了整型 int ,其它进制的只能用字符串来表示
... hex(4)
'0x4'