blog icon indicating copy to clipboard operation
blog copied to clipboard

二进制

Open qingquan-li opened this issue 8 years ago • 0 comments

二进制是计算技术中广泛采用的一种数制。

二进制数据是用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.11 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 十进制数字转二进制)

_20170112015405





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'

qingquan-li avatar Jan 11 '17 17:01 qingquan-li