二进制及相关概念是什么?

 

二进制,八进制,十进制,十六进制……


N进制,逢N进位;二进制,逢2进1。

 

二进制不便于人工阅读,人类最习惯理解的是十进制数,为了加快人类对二进制数的阅读与理解,于是人类发明八进制和十六进制做跳板来快速阅读二进制数据。

在十进制中,一个数字的最右一位,即最低位称为个位,个位的左边一位,即更高一位叫十位,然后从右至左依次是百位千位。但是在其他进制中,就不再好这样称呼各个位了,一般从最右一位至最左一位,也就是从低位到高位依次叫0位,1位,2位3位N位等等。

三位二进制数能表示0~7共八个数,四位二进制数能表示0~15共十六个数,五位二进制数能表示0~31共三十二个数。

综合考虑,十六进制不长不短,比八进制能表示更多位的二进制数,比三十二进制数更容易口算,十六进制与二进制或十进制转换既容易被人记住又容易被人理解,八进制慢慢用的少了,三十二进制则几乎没考虑过,太大的数运算不方便。人类大脑通过十六进制这个跳板,很容易对二进制数进行运算。

二进制与十六进制转换口诀是8421,这种有规律的倍数递减的口诀很容易记,转换法则是个位数的加法,也很容易口算。

4位二进制数对应的十进制数从高位到低位分别是8421,这4个数相加正好是15,十六进制数就在十进制数基础上添加了abcdef这6个数表示10~15的数。在换算时,一个4位二进制数按位逐位换算,当换算某位时(此时忽略其他位(或假设为0)),若该位为1,则换成对应的8或4或2或1,若该位为0则算为0,待4位二进制数逐位换完后,将每位换到的十进制数算总和即可轻松换成1位的十六进制数。仿照十进制里个十百千位的叫法,在二进制的4位数中,最低位叫1位数,再高一位可以叫2位数,再依次就叫4位数8位数。

此外,二进制中的位不同于十进制的位,二进制中的“位”字在英文中是bit,而十进制的个位英文为unit,百位英文为hundreds。

记住8421口诀,任意一串二进制数都容易口算成一串十六进制数,只要将一串二进制数从低到高每4位隔开,顺序对应的每4位二进制数换算成对应的1位十六进制数即可。

为便于区分不同进制数,在数据后跟英文单词首字母表示,后缀B(binary)表示二进制,D(decimalism)表示十进制,H(hexadecimal)表示十六进制。

1000B = 8D

0100B = 4D

0010B = 2D

0001B = 1D

任何进制数换算成十进制数都比较方便,m进制数的第n位数k的十进制数就是该数乘以该进制数的该位次方,即k * mn,有这个公式,一个m进制数Y的十进制数就是各个位的十进制数相加,假设Y有z个位,Y的第n位数表示为Yn,则Y0 * m0+ Y1* m1+ …… + Yz * mz。其他进制之间的转换公式不在此列出,其他讲计算机基础的书都广泛介绍,网上搜索也可以找到详细内容。

二进制及其运算是计算机科学入门的数学基础,布尔逻辑运算就是二进制数的快速运算法则。因此,能对数字的进制转换及布尔逻辑做快速心算是从数学基础上掌握计算机科学的入门基本功。

在计算机的存储器和寄存器中,存放的都是二进制数,而人们发明的各种调试器及人机交互界面都至少会提供十六进制数据以供阅读。形象一点的说,十六进制数就是计算机科学领域的官方语言。

有了数据,就可以用不同的数据表示不同的意义,比如指令就是一种意义。只要严格定义数据与指令的一一对应关系,就可以用某个特定数表示某个特定的指令,同理,某特定数也可以表示某个特定字符,这样人类的语言就可以替换为数据存储在计算机里。

根据数学理论,可以用有限固定位的数据来代表有限的意义。在计算机发展过程中,人们曾经也设计过比如7位(bit)或23位这样的计算机,但人们逐步体会到8位,16位,32位这样的二进制数在表达意义上的优缺点。8位二进制数正好是2位十六进制数,数据转换排列整齐有优美感,而其他有限位的二进制数不能整齐的转换为十六进制数,自然就被摈弃了。人们又给8位的二进制数据另起了个名字,叫Byte(中文译作字节)。

有限位的数据表示有限的意义,在有限的意义满足使用者的需求时,就是简单干净的美;但在有限的意义不能满足使用者的需求时,就需要更大的有限位来表示更多的有限意义。因此,在计算机与人类需求的相互满足与不满足的发展中,计算机从最早的8位就发展到了如今的64位。

 

二进制如何运算?二进制数之间怎么做加减乘除呢?

 

英国人布尔发表论文完整的阐述了一套用于二进制数运算的法则,这套法则就取名叫布尔逻辑运算。基本运算法则不再是十进制中的加减乘除,而是与,或,非。从“与或非”再衍生出“与非,或非,异或,同或”等法则。布尔逻辑运算的具体细节可以归纳成一个简短的真值表,很简单,在此简单基础上做重复累计就可以做非常复杂的运算。

需要重点想清楚的是:二进制数之间怎么做加减乘除呢?

或者说二进制数“与或非”法则如何转换成加减乘除法则?

首先加法在数学上严格意义其实是分成两步走:两个1位数相加和满阶进位。

因此,完整意义上的加法在二进制数之间是先位对齐做异或,然后再满2进位。

异或,或说是两个1位二进制数的异或运算法则就是相同为0,不同为1。

所以,1+1=? 如果是十进制,1+1=2,可如果是二进制呢?应该是1+1=10,初学者看这里就要看晕了,1+1=10 ??这里的10实际是二进制的10,准确应该写成10B,要读作壹零,不能读成十。按8421口诀,二进制的壹零换算成十进制数就是2。

如果两个二进制数只做异或,不进位,就叫半加。在二进制运算法则中,两个二进制数相加的符号是⊕,所以在二进制半加法则下,1+1=0要写做1⊕1=0,只有在二进制进位加法则下才有1⊕1=10。

 

二进制数能做加法了,那减法乘法除法呢?

 

其实减法也可以将减数看成负数,1-1可以看成1+(-1)。二进制数从正数算相应的负数实际是基于有限位的二进制数先取反再加1,这也叫补码法则。只有有限位的二进制数才能做取反,只有有限位高位的二进制数取反才能知道最多取反多少位数,比如8位二进制数下对1取反的值为11111110B,4位二进制数下对1取反的值为1110B。

这里还涉及到二进制数在计算机中的表达法则,即补码法则,只有按该法则,一个二进制数才能区分是正数还是负数。在此基础上才能做二进制的减法运算。对于运算器来说,只有以补码形式存储的二进制数,无符号数与有符号数只是同样的一个补码的不同表达形式而已。

乘法是加法的累加效果,因此有了加法,就能做乘法。按照这种逻辑,除法也就能用减法做了。相对于加减乘法,二进制数的除法是最复杂的运算。

 

二进制数如何表达负数小数?

 

简而言之,二进制的正负数用最左一位,即最高位表示,最高位为0表示该数是正数,最高位为1表示该数是负数。一个负的二进制数用补码表示,换句话说二进制的负数是用正数的补码来计算,也就是将一个正的二进制数除了符号位之外其他位都取反再加1,然后符号位填1。

在有符号数(即区分正负数)的有限位中,最高一位是符号位,不能看成数,不能当作数来做换算或是计算。如果在无符号数中,则最高位不表示符号位。

十进制数的小数部分和整数部分不能用同样公式进行换算,十进制数的小数部分必须单独用乘2公式去换算成二进制数。十进制数的小数反复做乘二计算,结果的小数做下一次乘二计算,最终将小数乘尽为整数为止,每次所得整数部分的1位数依次是二进制数小数的高位到低位。