【aha, Insight】原来二进制数是这样

来源:互联网 发布:股票交易大数据 编辑:程序博客网 时间:2024/04/30 15:36

一直不明白为什么二进制这么流行,试想大概就是因为0和1正好表示计算机的开、关或是高、低电平之类的东西;上面的原因却是没错,不过在《aha,Insight》里得到了另一个更兴奋的答案,原来是这样,茅塞顿开。

 

一个简单的问题:

问题描述大概是这样,Mr. Black 和Mrs. White的药店新到了一批药,一共有10瓶,每瓶里面装了上千颗药丸,每颗药丸重100毫克;新药上架后,突然接到通知说其中有一瓶药有问题,这瓶有问题的药里面每颗药丸都比正常的中了10毫克,先有一个称(不是天平),请问要怎么分辨是哪一瓶药出了问题?

 

最笨,也是最容易想到的方法就是从每瓶药里面拿一颗药出来称,最差的情况就是称10次,找到有问题的一瓶,可是有没有更好的方法呢?

答案是肯定的,而且只需要称一次就搞定,方法如下:

从第一瓶药里面拿1颗,从第二瓶药里拿2颗,从第三瓶药里拿3颗,这样继续下去……最后把所有拿出来的药混在一起称,得到重量后就能知道是那瓶药有问题了;原因,假设10瓶药都没有问题,那么我们拿出了55颗药,重量应该是5500;如果我们得到的重量是5510,证明第一瓶药有问题,如果得到的重量是5520,则第二瓶药有问题……,拿出的药数量相当于给药瓶编号,每瓶药有一个唯一的编号,这样的策略我们可以称一次就知道有问题的药瓶是哪个了。

 

哈哈,真是灵机一动,可是跟标题的二进制数有啥关系?别急,看下面一个难一点的问题:

问题大概跟上面的差不多,只是这次更糟,不是一瓶药有问题,而是不知道10瓶中有多少瓶有问题。哎哟,这可麻烦了,不能再用上面的策略;但是称10次绝对没问题,是不是这次真的要称这么多次了呢?

 

答案还是只需要称一次,改变点策略就行:

上题的关键在于,我们知道只有一瓶有问题,那么只需要按瓶为区分单位,给每瓶标上唯一的标识,那么就可以用和来区分具体是那瓶有问题,达到一次就搞定的目的;这次的策略是一样的,需要通过拿出不同数量的药丸给瓶子编号,但是因为不知道到底有多少瓶药有问题,所以编号就不能像之前那样了,那么要怎么做呢?这就需要二进制数的知识了,我们知道任何非零正整数都能用这样一串数的和唯一表示出来,1,2,4,8,16...,用二进制标识,他们刚好是2^0,2^1,2^2,2^3,2^4...(为什么能,稍微想下吧,因为任何非零正整数都能表示成二进制数);所以我们可以这样拿药丸,从第一瓶里拿1颗,从第二瓶里拿2颗,从第三瓶里拿4颗,从第四瓶里拿8颗,如此下去,再把所有拿出的药混合称一次就知道哪些药瓶有问题了;这是个等比数列,我们很容易知道在10瓶都没有问题时,拿出的药的重量应该是2^9-1,那么用我们得到的真实重量减去这个标准重量,得到的就是多出来的重量,再转换成二进制数后,位上为1的位对应的药瓶就是有问题的(位上为1,证明对这位做了贡献,每瓶药唯一对应能做贡献的位,比如第一瓶只能对第0位做贡献,第二瓶只能对第1位做贡献等等);举个例子,假设我们得到的差是27,转换成二进制就是11011,那么,就知道是第1、2、4、5瓶有问题了。

 

这下明白了吧,怪不得二进制这么流行,因为它实在太强大了。

 

我一直坚信计算机是离不开数学的,要学好计算机必须要先学好数学,再在实践中增加工程类的知识和方法,所以不管周围人怎么觉得我怪异,我都会坚持学习数学,再说了,本来就是我的爱好,为啥要放弃?明显不是我风格,哈哈;另外知识从来不是学出来的,必须通过自己的亲身实践,去做去推敲,在失败中获得真知,编程强调的多写,数学亦如此,要多做多总结,有时,在不理解数学问题时,放到现实的具体问题中去,往往能得到意外的收获,毕竟数学最初就是人们从解决现实问题中总结出来的理论和方法。

 

哎哟,又碎碎念了一大堆,不过大概找到点回学校要怎么忽悠别人的方向

 

能够融入数学乐趣中果然比较high,算是无聊工作中的重要调味剂吧,噢,还有我的文艺小生活,明天又有话剧看咯,期待期待

原创粉丝点击