二进制的趣事

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

对于一个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。

转载于:https://www.cnblogs.com/Agnostida-Trilobita/p/10981688.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[ 问题描述 ] 利用哈夫曼编码进行信息通讯可以大大提高信道利用率, 缩短信息传输时间,降低传输成本。但是, 这要求在发送端通过一个编码系统对待传数据预先编码; 在接收端将传来的数据进行译码( 复原 )。对于双工信道( 即可以双向传输信息的信道 ), 每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编译码系统。 [ 基本要求 ] 一个完整的系统应具有以下功能: (1) I:初始化(Initialization)。从终端读入字符集大小 n,及 n 个字符和 n 个权值,建立哈夫曼树, 并将它存于文件 hfmtree 中。 (2) C:编码(Coding)。利用已建好的哈夫曼树(如不在内存, 则从文件 hfmtree 中读入), 对文件 tobetrans 中的正文进行编码, 然后将结果存入 codefile 中。 (3) D:译码(Decoding)。利用已建好的哈夫曼树将文件 codefile 中的代码进行译码, 结果存入文件 textfile 中。 (4) P:印代码文件(Print)。将文件 codefile 以紧凑格式显示在终端上, 每行 50 个代码。同时将此字符形式的编码文件写入文件 codeprint 中。 (5) T:印哈夫曼树(Tree print)。将已在内存中的哈夫曼树以直观的方式( 树或凹入表行式 )显示在终端上, 同时将此字符形式的哈夫曼树写入文件 treeprint 中。 [ 测试数据 ] (1)利用教科书 6-2 中的数据调试程序。 (2)用下表中给出的字符集和频度的实际统计数据建立哈夫曼树, 并实现以下报 文的编码和译码: "THIS PROGRAM IS MY FAVORITE". 字符 A B C D E F G H I J 频度 186 64 13 22 32 103 21 15 47 57 1 字符 K L M N O P Q R S T U 频度 5 32 20 57 63 15 1 48 51 80 23 字符 V W X Y Z 频度 8 18 1 16 1 [ 实现提示 ] (1) 文件 codefile 的基类型可以设为子界型 bit=0..1。 (2) 用户界面可以设计为"菜单"方式: 显示上述功能符号, 再加上"E",表示结束运行 End, 请用户键入一个选择功能符。此功能执行完毕后再显示此菜单, 直至某次用户选择了 "E"为止。 (3) 在程序的一次执行过程中, 第一次执行 I,D 或 C 命令之后, 哈符曼树已经在内存了, 不必再读入。每次执行中不一定执行 I 命令, 因为文件 hfmtree 可能早己建好。 [ 选作内容 ] (1) 上述 codefile 的基类型实际上占用了存放一个整数的空间, 只起到示意或模拟的作用。现使 codefile 的基类型 package=integer, 把哈夫曼码紧缩到一个整型变量中去, 最大限度地利用码点存储能力, 试改写你的系统。 (2) 修改你的系统, 实现对你的系统的源程序的编码和译码。( 主要是将行尾符编/译码问题 ) (3) 实现各个转换操作的源/目文件, 均由用户在选择此操作时指定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值