1.6 计算机这个“笨”盒子——关于二进制运算
本节的标题是“计算机这个‘笨’盒子”,其实这并不为过。要知道,连小学生都可以熟练运用的十进制运算在计算机中却是比登天还难。在计算机中,所有的数值都要转换成二进制数之后再进行运算。本节将介绍关于二进制的相关知识,以便更好地理解计算机的工作原理。
帮你解惑
计算机中存储数据的原理是根据电子元件的不同状态表示不同的数值。由于电子元件的高电平和低电平两种状态差异最易实现,因此二进制在计算机数据存储中有着得天独厚的优势。
1.6.1 了解进制
进制,换句话说就是数学上逢几进一的计数规则。在生活中我们常用的是十进制,它的计数规则是逢十进一。例如,买东西的时候10个一分组成一角,10个一角组成一元,10个一元组成10元,10个10元组成100元。实际上,除了十进制外,二进制、八进制和十六进制也是十分常用的进制规则。
在二进制中,只有0和1两种数值,例如十进制数3表示成二进制就是11。八进制中有0~7七种数值。十六进制中除了0~9十个数值外,还包括A、B、C、D、E、F六个字母。
掌握进制转换的方法是十分必要的,将十进制转换成二进制通常采用“除二取余法”,这种方法的核心是将十进制数除以2,将其余数取出,将商继续进行“除二取余法”,直到商为0,之后将所有取出的余数逆序排列,即为当前十进制数的二进制形式。下面演示将十进制数89转换成二进制数的过程。
开始:89÷2=44……1
继续:44÷2=22……0
继续:22÷2=11……0
继续:11÷2=5……1
继续:5÷2=2……1
继续:2÷2=1……0
继续:1÷2=0……1
逆序结果:1011001
将二进制数转换成十进制形式则简单得多,使用“按权展开求和”即可。即从右往左,第1位乘以2的0次方,第2位乘以2的1次方,以此类推。例如二进制数1011001=1×20+0×21+0×22+1×23+1×24+0×25+1×26=89。
至于八进制和十六进制与十进制的转换,可以通过二进制来做中转。首先,八进制数和十六进制数转换成十进制也是采用“按权展开求和”,例如八进制数71=1×80+7×81=57,十六进制数2A=10×160+2×161=42。十进制数要转换成八进制数,可以先将其转换成二进制形式,例如十进制数57可以转换成二进制数111001,再将二进制数111001从右到左每3位聚合成一位八进制数,即71,所以十进制数57的八进制形式为71。同样,对于十进制数42,首先将其转换成二进制数101010,再将其按从右到左的顺序每4位聚合成一位十六进制数,即2A。
关于进制转换,本节只需要理解不同进制的含义与联系即可,这对后面的学习有很大的帮助。
帮你解惑互联网上有许多进制转换工具,例如下面的网站:
http://tool.oschina.net/hexconvert。
你只需要配置需要进行转换的进制模式即可。在编程中,并不是所有的工作都需要自己手动做,要学会使用工具。
1.6.2 在Python中表示各种进制的数值
Python中的进制
通过1.6.1小节,你已经学习了进制的相关知识。在Python中,可以通过给数值添加前缀来表明其所采用的进制。除了十进制外,在编程中常用的还有二进制、八进制和十六进制。
在Python中,默认采用十进制数值,就像我们前面进行的简单运算,都是以十进制为基础的,在数值前面加前缀0b用来描述二进制数值,如图1-36所示。
图1-36 在Python中使用二进制数
在数值前面加前缀0用来描述八进制数值,如图1-37所示。
图1-37 在Python中使用八进制数
需要额外注意,无论是在数学中还是某些编程语言中,数值前面的0通常都是可有可无的,在Python中要格外小心,前缀0会被解析成八进制数值。
在数值前面加前缀0x用来描述十六进制数值,如图1-38所示。
图1-38 在Python中使用十六进制数
Python还为我们提供了几个方便的方法,可以直接将十进制数值转换为二进制、八进制或十六进制的形式,只是转换结果为字符串类型。示例代码如下:
帮你解惑
你可能看到了,上面“#”号后面有一些内容,但是并不妨碍代码的执行,这部分内容在编程中被称为“注释”。关于注释后面会专门介绍。