二进制是什么东东?这是一个有趣的问题,第一次听到二进制,应该是在小学的时候,五年级?不太清楚了。接下来,想简单的聊聊个人(书上+百度ORZ)对二进制的看法。
用书上类似比较官方的语言就是说,在基数为 k k k 的位置记数系统(其中 k k k 是一个正的自然数,它也叫做基数), k k k 个基本符号(或者叫数字)对应于包括0在内的最小的 k k k 个自然数(依稀记得应该是教科书上有过变动的,一直没定下来,零到底是不是自然数)。 而要产生其他的数,符号在数中的位置要被用到。最后一位的符号用它本身的值,向左一位其值乘以 k k k 。一般来讲,若 k k k 是基底,我们在 k k k 进制系统中的数表示为 a 0 + a 1 k + a 2 k 2 + . . . + a n k n a_0 + a_1k + a_2k^2 + ... + a_nk^n a0+a1k+a2k2+...+ankn的形式,并按次序写下数字 a 0 , a 1 , a 2 , . . . , a n a_0,a_1,a_2,...,a_n a0,a1,a2,...,an。这些数字是0到 k − 1 k-1 k−1的自然数。
一般来说, k k k 进制中的数写成如下形式:
( a n a n − 1 . . . a 0 . b 0 b 1 . . . ) k = ∑ i = 0 n a i k i + ∑ i = 0 ∞ b i k − i (a_na_{n-1}...a_0.b_0b_1...)_k = \sum _{i=0}^{n} a_ik^i+ \sum _{i=0}^{\infty}b_ik^{-i} (anan−1...a0.b0b1...)k=i=0∑naiki+i=0∑∞bik−i
现在了解进制之后,我们来看看二进制。
17世纪至18世纪的德国数学家莱布尼茨,是世界上第一个提出二进制记数法的人。用二进制记数,只用0和1两个符号,无需其他符号.[1]
二进制的数据也是采用位置计数法,其中位权是以2为底的幂。例如二进制数据100.01,逢2进1,其权的大小顺序为 2 2 , 2 1 , 2 0 , 2 − 1 , 2 − 2 2^2, 2^1, 2^0,2^{-1},2^{-2} 22,21,20,2−1,2−2。对于有n位整数,m位小数的二进制数据用加权系数展开式表示,可以类比于上面的 k k k 进制,我们把 k k k 用 2 代替即可。即: ( a n a n − 1 . . . a 0 . b 0 b 1 . . . b m ) 2 = ∑ i = 0 n a i 2 i + ∑ i = 0 m b i 2 − i = a 0 ∗ 2 0 + a 1 ∗ 2 1 + . . . + a n ∗ 2 n + b 0 ∗ 2 − 1 + . . . + b m ∗ 2 − m (a_na_{n-1}...a_0.b_0b_1...b_{m})_2 = \sum _{i=0}^{n} a_i2^i+ \sum _{i=0}^{m}b_i2^{-i} = a_0 * 2^{0} + a_1 * 2^{1} + ... + a_n * 2^{n} + b_0 * 2^{-1} + ... + b_m * 2^{-m} (anan−1...a0.b0b1...bm)2=i=0∑nai2i+i=0∑mbi2−i=a0∗20+a1∗21+...+an∗2n+b0∗2−1+...+bm∗2−m
一般计算,其实主要是各种进制之间的换算,其中最常见的还是各种进制与十进制的数值进行换算,毕竟日常生活中最常见的就是十进制了。
eg1: ( 110.11 ) 2 (110.11)_{2} (110.11)2 到十进制(the decimal system)
按照我们第一个公式的运算,我们将k换成2,然后对应的数字进行计算即可:
( 110.11 ) 2 = 1 ∗ 2 2 + 1 ∗ 2 1 + 0 ∗ 2 0 + 1 ∗ 2 − 1 + 1 ∗ 2 − 2 = 4 + 2 + 0 + 0.5 + 0.25 = ( 6.75 ) 10 (110.11)_{2} = 1 * 2^2 + 1*2^1 + 0 * 2^0 + 1 * 2^{-1} + 1 * 2^{-2} \\ =4+2+0+0.5+0.25 \\=(6.75)_{10} (110.11)2=1∗22+1∗21+0∗20+1∗2−1+1∗2−2=4+2+0+0.5+0.25=(6.75)10
PS:这样看起来很膈应,但是找了半天没看到公式如何实现换行后等号对齐的功能(Latex中的方法似乎行不通),将就着看吧。
其他进制转成10进制,方法类似。
但是,要是其他进制转换成2进制,计算就变得复杂了些.
这里还是以十进制转化成二进制做例子:
eg2: ( 83.37 ) 10 (83.37)_{10} (83.37)10 到二进制(the binary system)
首先,我们将 83.625 分成两个部分,包括整数部分和小数部分,即83和0.625。接着,我们分两组来分别操作我们的两组数。 我们用83去除于2,会得到商和余数(41,1),同理,我们继续用商来除于2,得到商和余数(20,1),反复操作,知道商小于2为止(如果是其他进制,比如k进制,则商小于k即可)。这个时候假设我们分别得到了 ( a 0 , b 0 ) , . . . , ( a n , b n ) (a_0,b_0), ...,(a_n,b_n) (a0,b0),...,(an,bn),这么多组商和余数,我们将余数按照逆序排列,记为 b n b n − 1 . . . b 0 b_nb_{n-1}...b_0 bnbn−1...b0,此时,我们就完成了整数部分的换算。而小数部分于此不同,如本例的0.625,要不断的乘于2,得出他的整数部分,然后用剩下的小数部分再乘于2,依次操作,直到计算结果为1,则停止计算。这里不好描述,我用图片来解释:
二进位计数制仅用两个数码。0和1,所以,任何具有二个不同稳定状态的元件都可用来表示数的某一位。而在实际上具有两种明显稳定状态的元件很多。例如,开关的”开“和”关“; 电压的”高“和”低“、”正“和”负“;纸带上的”有孔“和“无孔”,电路中的”有信号“和”无信号“, 磁性材料的南极和北极等等。 利用这些截然不同的状态来代表数字,是很容易实现的。不仅如此,更重要的是两种截然不同的状态不单有量上的差别,而且是有质上的不同。这样就能大大提高机器的抗干扰能力,提高可靠性。
二进位计数制的四则运算规则十分简单。而且四则运算最后都可归结为加法运算和移位,这样,电子计算机中的运算器线路也变得十分简单了。不仅如此,线路简化了,速度也就可以提高,这也是十进制所不能相比的。
在电子计算机中采用二进制表示数可以节省设备。可 以从理论上证明,用三进制最省设备,其次就是二进制。但由于二进位制有包括三进位制在内的其他进位制所没有的优点,所以大多数电子计算机还是采用二进制。此外,由于二进制中只用二个符号 “ 0” 和“1”,因而可用布尔代数来分析和综合机器中的逻辑线路。 这为设计电子计算机线路提供了一个很有用的工具 。
二进制的符号“1”和“0”恰好与逻辑运算中的“对”(true)与“错”(false)对应,便于计算机进行逻辑运算。
二进制还是一个比较有意思的东西,特别是现在编程学习中基本很少见了(其实自己也没有见过什么汇编语言,虽然我知道有这个东东,哈哈),多多了解还是有好处的。