二进制数据处理.ppt

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
二进制数据处理 福州大学 2013 级计算机类一班 031302126 杨锦洲 2014.09.08 问题描述 ? 给定一个正整数 N ,找出另一个正整数 M ,使得 N 和 M 转化为二进制时,它们所出现的“ 1 ”的个数一致, 且 M 必须比 N 大。输出一个满足条件的最小的 M 。 ? 例如 78 ,转换成二进制为 1001110 ,这个二进制数中 有 4 个“ 1 ”。而 83 ( 1010011 )和 86 ( 1010110 )都 满足二进制中“ 1 ”的个数与 78 一样,且值都比 78 大。但显然 83 是最小的那个,输出它。 问题分析 N :给定的正整数; M 要找到的数。 对 M 的要求: 一、“ 1 ”的个数与 N 相同; 二、大于 N ; 三、所有符合条件的数中的最小值。 问题解决 针对问题一:将 N 转换为二进制存储在数组中 考虑到问题二和三,这里采用逆序存储(低 位在前,高位在后)。 针对问题二、三:将“ 1 ”往高位移位。 例如: N:100101 (正常二进制数)→ 101001 (数组中) 将数组中第一个“ 1 ”向后移一位就可以得到 M 的逆序二进制数。 核心代码 (数组所有元素皆已初始化为 0 ) for(i=0;n!=0;i++) { t[i]=n%2; n=n/2; } 用数组 t[17] 存储 N 的逆序二进制数。 ( N=1000002^17=131072 ) 0 1 1 1 0 0 1 78 ( 1001110 )→ (t[17] 数组中 ) 标号 t 0 1 2 3 4 5 6 for(j=0;ji;j++)if(t[j]==1) { 找到最低位的 1 以及与其最 for(k=j+1;;k++)if(t[k]==0)break; 近但比它高位的 0 break; t[1] 、 t[4] ( j=1,k=4 ) } 核心代码 m=t[k-1]; t[k-1]=t[k]; t[k]=m; 0 1 1 1 0 0 1 高位的 0 降位 ↓ 0 1 1 0 1 0 1 if(k-j1) for(ints=0;s(k+1)/2;s++,j++) {m=t[s];t[s]=t[j];t[j]=m;} 判断 0 降位之后比 0 低位的 1 是否需要降位 通过数组元素的交换完成 降位 二进制转十进制 for(k=i;k=0;k--)sum+=t[k]*pow(2,k); 算法的优缺点分析和改进 算法优缺点分析: 优点:只需要通过简单的移位;思路简明清 晰; 缺点:需要多考虑细节;程序实现上稍微复 杂 总结 整个算法的时间主要花费在几个循环结构上,特别 是当数值较大的时候。因为时间复杂度较难计算, 便没有进行统计。 这里有个细节:当遇到低位全为 0 高位全为 1 的情况 如: 11111100000 ( 11 位)时由于数组 t[17] 所有元 素初始值为 0 ,此时 j=5 、 k=11, 只要将 t[10] 与 t[11] 交换,并将低位的 0 ( t[0]~[t4]) 与高位的 1 ( t[5] ~t[9]) 交换就得到 10000011111 。

文档评论(0)

magui + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8140007116000003

1亿VIP精品文档

相关文档