小速学编程:从《三体》里学习计算机数字系统

陈小速:一名职业技术学院计算机技术与应用专业的学生 , 他梦想成为一名程序员 。
吴进:一所重点大学软件工程专业大三学生 , 编程经验丰富 。
阅读本文需要一些基础知识 , 可以先温习一下历史文章:小速学编程:什么是编程语言
引言陈小速在上次回去后 , 花了不少时间学习二进制、十六进制的内容 。 虽然了解了一些概念 , 但还是似是而非的感觉 , 他知道这样的状态是不行的 , 于是他带着疑问又来找吴进了 。
吴进耐心地听陈小速把学习中的疑惑说完之后 , 笑着说:“没关系 , 有问题很正常 。 小速你是直接学习的知识本身 , 那你有想过为什么是这样吗?比方说为什么要设计出二进制来?”
陈小速听了茫然地摇了摇头 , 说:“我只知道二进制只有0和1两个数字 , 然后一堆0和1构成的序列可以转换成十进制、十六进制的数 。 我们有十进制这种计数方式不就够了吗?”
吴进哈哈一笑 , 说:“行 , 那我们就先从为什么开始说起吧 。 ”
小速学编程:从《三体》里学习计算机数字系统文章插图
士兵与晶体管吴进却先问了个看起来不相干的问题:“小速 , 你记得<三体>第一部里有一章是牛顿、冯·诺依曼和秦始皇吗?”
“记得啊 , 怎么了?” 陈小速有点丈二和尚摸不着头脑 , 不知道怎么扯到他最爱看的科幻小说上了 。
“牛顿和冯·诺依曼是怎么说服秦始皇给他们三千万人 , 组建一个人肉计算机的?”吴进提示着问 。
“好像是找了三个士兵出来 , 然后冯·诺依曼教他们怎么举旗子 , 对吧?” 陈小速也在回忆着这一章的内容 。
“对 , 那每个士兵需要干什么?”
“举起旗子表示1 , 放下旗子表示0 。 两个士兵表示输入 , 一个士兵表示输出 , 就构造出了一个门电路 。 ”
“很棒 , 你记得还真清楚 。 ” 吴进表示了赞许 , 接着说 , “那么在实际的CPU里面 , 这样的士兵组就被称之为晶体管 。 单个晶体管的功能很简单 , 可以理解为它里面就站着一组三位拿着旗子的士兵 。 一个士兵可以干的活看起来几乎没什么用 , 但只要有足够多的士兵 , 就可以赢得战争的胜利 。 这就是CPU工作的原理 , 它里面的晶体管越多 , 性能也就越强大 。
“而现代晶体管的原材料是半导体硅 , 最早由美国仙童公司发明生产 。 之后著名的‘八叛徒’离开仙童 , 创办了多家业内成功的芯片公司 , Intel公司成为微处器领域的霸主 , 那个地区也以硅谷之名闻名于世了 。 ”
听得这番话 , 陈小速连连点头 , 吴进续道:“得益于集成电路技术的发展 , 在一枚硬币大小的CPU芯片上 , 排列着几十亿个这样的晶体管 。 你想想 , 秦始皇也只给了他们三千万人 , 远远不如你手机里的那块小小芯片呢 。 ”
陈小速咂着舌头好半天说不出话来 。
小速学编程:从《三体》里学习计算机数字系统文章插图
二进制“小速 , 你再想想 , 两个士兵通过举旗与放下 , 总共可以表示几种状态?” 吴进问着 。
“我简单点说啊 , 有——举举 , 举放 , 放举 , 放放 。 四种 , 对不对?” 陈小速有点兴奋起来了 。
“很好 , 如果用数字来表示 , 那就是——11 , 10 , 01 , 00 。 我们可以将这四种状态与我们的自然数对应起来 , 如果00表示十进制的0 , 那么从左往右 , 就是3 , 2 , 1 , 0 。 好了 , 问题又来了 , 如果要表示4 , 那用0和1应该怎么表示?”
陈小速歪着脑袋想了一会儿 , 说:“吴大哥 , 我再上一个士兵行不行?”
“哈哈 , 对呀 , 你自己摆摆看 。 ” 吴进笑着鼓励道 。
“我现在有三个士兵 , 三个都放下表示0 , 那我让最左边的举旗就表示4 , 是100对吗 , 吴大哥?” 陈小速开心地叫了起来 。
这回连吴进也不住地点头 , 说:“小速你自己好好推算一下 , 看看二进制和十进制有什么规律没 。 还有就是接下来为了方便阅读 , 我建议你在二进制数字后面加上字母b , 以和十进制数区分 。 ”
小速学编程:从《三体》里学习计算机数字系统文章插图
转换陈小速埋头在稿纸上画了老半天 , 抬起头来茫然地说:“吴大哥 , 我好像隐约有点感觉 , 但又说不清楚 。 你看 , 我算到1000b表示8 , 100b表示4 , 10b表示2 , 那10000b就是16吧 。 每加一个士兵 , 就是多两倍的关系吗?”
“对呀 , 这就是二进制的进位 。 你想想看 , 十进制每进一位 , 是不是多了十倍?” 吴进提示着 。