zoukankan      html  css  js  c++  java
  • 二进制的趣事

    计算机使用的二进制,为什么要使用二进制而不是三进制、六进制、八进制呢?我们从进制的效率理解一下这个问题。

    对于一个n位二进制数来说需要2n个状态表示2^n个数,对于一个n位十进制数来说需要10n个状态表示10^n个数,对于一个n位s进制数来说需要sn个状态表示s^n个数。那么对于s进制来说,效率最高的进制是几呢?答案是e进制,就是我们常说的自然常数e(关于自然常数的神奇之处不在此处赘述)。我们令M=s^n,P=sn,那么当M为一个定值时,P越小则进制效率越高。n=logsM,将这个式子代入P=sn,得P=s·logsM。利用换底公式,P=s·lnM/lns。该函数在s=e时取得最小值。

    对于整数进制来讲,效率最高的应该是三进制,为什么我们会选择二进制作为计算机语言呢?因为对于计算机来说,二进制更容易实现,只需要高低电平就可以实现二进制的0和1两个数。实际上三进制数更能体现出人脑对事物的思考:对、错和不明确。然而三进制的实现过于困难,俄罗斯曾经研制过三进制的计算机,但因为某种原因而终止了计划。

    关于二进制有哪些应用实例呢?我们来探讨一下。

    问题一:有100瓶水,其中有一瓶是有毒的,另99瓶无毒。老鼠喝了毒药第二天就会死,那么给你一天时间,你最少需要几只老鼠才能辨别出哪一瓶是有毒的呢?

    这是二进制的一个典型应用。我们可以尝试把这100瓶水用二进制进行编号,需要七位数表示。1表示为0000001、2表示为0000010、3表示为0000011、……、100表示为1100100。把这些水编号后就开始让老鼠喝水,编号第一位是1的水让1号老鼠喝、编号第二位是1的水让2号老鼠喝,以此类推,编号第七位是1的水让7号老鼠喝。第二天后,如果编号为1、3、6的老鼠死掉,那么我们就可以确定是编号为1010010的水有毒,也就是第82瓶水有毒。所以只要十只就可以在一天的时间判断出哪瓶水有毒

    问题二:有一个地主雇佣一群工人为他干活,每天需要付给这帮工人一根金条,需要每天结账。但是地主只有一串7根连在一起的金条,他只能砍两次把这串金条分开,问应该如何分才能保证每天工人来要工钱时都能付给他们呢?

    答案是分成一、二、四段,第一天给工人一段,第二天将两段的给工人,然后将第一天给的第一段要回来,第三天再将第二天要回的一段给工人。依次类推,就可以做到每天给工人结账。

    问题三:有1000个苹果,10个箱子,如何装箱才能使客户买任何数量的苹果都可以直接给他而不需要打开箱子?

     

    答案是489、256、128、64、32、16、8、4、2、1。

    对10个箱子一次编号:10号箱子2^0个、9号箱子2^1个、8号箱子2^2个……1号箱子489个。比如客户要买n个苹果,对于比489小的数,我们将它转换为二进制按照9-1号箱子进行一一对应,对于大于489的数,我们将它减去489再转换成二进制按照9-1号箱子进行一一对应就可以满足客户的需求。

    问题四:有100个囚犯,排成一排报数报到奇数就杀掉,剩下的再排成一排报数直到剩下最后一人,那么应该站在哪个位置才能活下来呢?

     

    在十进制中我们很好理解,为了保证最后一次报数不被杀必须要站在第二位由于每次被杀你所报的数都会减半所以利用倒推法2每次乘以二,一共会有6次,所以第一次站位应该站在64位。我们利用二进制再来理解一下这个问题。最后活下来的人必然报数10。对于二进制来说每乘以2就是将整个数前移一位(n进制乘以n就是将数前移一位)也就是说10乘以2就会变为100,100乘以2就会变为1000,以此类推一共六轮,也就是1000000,换算为十进制就是64。

  • 相关阅读:
    Filesystem Case-Sensitivity Mismatch
    内存分配
    单链表
    PHP校验日期格式是否合法
    Automatically populating $HTTP_RAW_POST_DATA is deprecated
    preg_match(): Compilation failed: character value in x{} or o{} is too large at offset 8
    CGI 和 FastCGI 协议的运行原理
    冒泡排序
    油猴子脚本-过滤百度广告
    查看chrome插件源码
  • 原文地址:https://www.cnblogs.com/Agnostida-Trilobita/p/10981688.html
Copyright © 2011-2022 走看看