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


“明白了 , 这就是不同进制的进位倍数 。 ” 陈小速又理解了 。
“那么 , 你现在是通过挨个数的方式 , 知道一个二进制数和十进制数的对应关系 。 但如果我随意给你一个二进制数 , 你如何算出对应的十进制数呢?”
陈小速挠了挠头皮 , 说:“我也不确定啊 , 好像可以用加法来算 。 比方说1001b , 就是1000b加1b , 换成十进制就是8加1 , 等于9 , 对吧?”
“不错 , 还可以进一步总结规律 , 就是二进制的每一位都可以用2的n-1次方来表示 。 例如1000b就是2的3次方 , 100b就是2的2次方 。 那么1101b用这种方式来计算 , 小速你列式算一下看 。 ”
陈小速在稿纸上写下2^3+2^2+2^0=8+4+1=13 。 他感叹道:“这样算起来果然方便多了 。 ”
小速学编程:从《三体》里学习计算机数字系统文章插图
运算“小速 , 我接着问啊 。 一加一等于几?” 吴进表情严肃地提出了这个问题 。
陈小速从吴进的脸上没有看到开玩笑的意思 , 迟疑着不敢回答了 , 不知道是不是还有更深层的内容 。 吴进却“噗”地笑了出来:“怎么 , 之前思路还那么敏捷 , 这个问题都不会了呢 。 ”
“哎 , 吴大哥 , 你也会捉弄人嘛 。 我还以为有个多大的坑等着呢 。 ” 陈小速是松了口气 。
“也不是没有坑 , 如果你说是二 , 那我就会说不一定 。 如果是在二进制里 , 答案是多少?” 吴进提出了真正的问题 。
陈小速嘴里念念有词 , 过了一会儿嚷道:“结果是10b , 对不对 , 吴大哥?”
“对 , 你是怎么算出来的?” 吴进饶有兴致地问 。
陈小速有些不好意思地说:“我是反推出来的 。 我想按十进制来说一加一等于二 , 我就将二转成二进制的10b了 。 ”
“这么做倒也没错 , 但如果复杂一些的运算 , 靠这样转换来去肯定很麻烦不是 。 所以你可以直接使用二进制的运算规律 。 ” 说着 , 吴进在稿纸上写下了一个加法算式 。
01b+ 01b= 10b看着这个算式 , 陈小速若有所悟 , 说:“二进制里面0和0加就是0 , 1和0加就是1 , 1和1加就进一位 。 我没说错吧?”
“完全正确 , 现在出一个题目给你 , 你计算一下答案吧 。 ”
1010b + 1101b = ?十六进制“小速 , 给你看一个东西 。 ” 吴进说着在稿纸上写下了一串长长的数字 。
10100000000000010000陈小速瞪着这一串数字都不知道要怎么提问 。 吴进解释道:“还记得我们前面说过的CPU指令吧 , 这实际上就是一条CPU可执行的指令呢 。 ”
“但这根本就不是给人类看的吧……” 陈小速说出了心里的感想 。
“那当然 , 所以后来科学家们才会发明汇编语言 , 这个也说过 。 今天要说的是计算机里存储的内容 , 本质上就是一串长长的0和1 , 无论是在内存还是硬盘上 , 都是一样的 。 如果将来你要查看文件的二进制内容 , 或者调试程序要查看底层数据 , 看这个肯定头皮发麻 , 对吧?”
“救命 , 我不要看这个 。 ” 陈小速发自内心的呼喊 。
“所以 , 我们借助十六进制这个工具 , 就可以简化多了 。 十六进制包含有十六个数 , 从0到9 , 之后就是从A到F 。 A表示十进制的10 , F表示15 , 这个前提一定要先理解 。 ” 吴进画了一张对照表 。
十进制0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 十六进制 0 1 2 3 4 5 6 7 8 9ABCDEF“经过刚才的学习 , 你现在告诉我 , 四位二进制数可以表示的范围是多少?”
“从0000b到1111b , 就是0到15 。 ” 陈小速自信地答道 。
“很好 , 正好就是16个数对不对?那么1111b是15 , 它对应的十六进制数就是F 。 那么1101b对应的十六进制数是多少呢?”
陈小速埋头一计算 , 答道:“是D!”
“非常棒 , 现在把我给你的那个串 , 每四位一组 , 转成十六进制看一看吧 。 ”
陈小速又是一通紧张的计算 , 最后在稿纸上写下来了 。
1010, 0000, 0000, 0001, 0000A0010吴进点了点头 , 说:“为了和别的进制区分 , 以后我们在十六进制数后面加上字母h吧 。 所以这个转换之后的答案是A0010h 。 ”
小速学编程:从《三体》里学习计算机数字系统文章插图
结语陈小速今天觉得自己真是收获满满 , 看着稿纸上写下的那些内容 , 想着回去一定要好好梳理一下了 。
吴进看看时间差不多了 , 说:“小速 , 今天讲的内容不算少 , 你回去以后一定要把知识巩固起来 。 还是老办法 , 向你的同学们讲解 。 同时也要做书本上课后的练习 , 把二进制、十进制、十六进制相互间的转换 , 还有运算都熟练掌握 。 在将来动手编写程序时 , 这是必备基本功 。 ”