• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > c#二进制逆序方法详解

c#二进制逆序方法详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#将字符串逆序输出,c#逆序输出,c#字符串逆序,c#字符串逆序输出,二进制逆序等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

原题

一个整数,可以表示为二进制的形式,请给出尽可能多的方法对二进制进行逆序操作。 例如:10000110 11011000的逆序为 00011011 01100001

分析

题目中说是一个整数,对它的二进制进行逆序。并不是一个01字符串,或者01的数组。那么我们该如何解决这个问题呢?方法还是比较多的,有的中规中矩、有的非常巧妙。我们要掌握中规中规的方法,见识更多的巧妙的方法。慢慢的,能够举一反三,在遇到新的问题时,能够有灵思妙想。

最直接的方法

直接的方法,很容易想到:有如下代码:

通过查表的方法

在遇到位操作的问题时,往往题目中限定了总的位数,比如这个题目,我们可以认为32位。这就给我们带来了一个以空间换时间的解决思路:查表法。位数是固定的,可以申请空间,存储预先计算好的结果,在计算其他的结果的时候,则查表即可。

32位相对于查表来讲,还是太大了。既然这样缩小范围,32个bit,也就是4个byte。每个byte 8bit,可以表示0-255的整数。可以通过申请256大小的数组,保存这256个整数,二进制逆序之后的整数。然后将一个32位的整数,划分为4个byte,每一个byte查表得到逆序的整数:r1,r2,r3,r4。按照r4r3r2r1顺序拼接二进制得到的结果就是最终的答案。

这是一个思路,大家可以进一步思考,尝试。

巧妙的方法

我们这里主要分析这个巧妙的方法,核心思想是:分治法。即:

•逆序32位分解为两个逆序16位的
•逆序16位分解为两个逆序8位的
•逆序8位分解为两个逆序4位的
•逆序4位分解为两个逆序2位的
最后一个2位的逆序,直接交换即可。也就是分治递归的终止条件。但是,在上面的过程中,还没有应用到位操作的技巧。根据动态规划的思想,我们可以自底向上的解决这个问题:

•每2位为一组,进行交换,完成2位逆序
•每4位为一组,前面2位与后面2位交换,完成4位逆序
•每8位为一组,前面4位和后面4为交换,完成8位的逆序
•每16位为一组,前面8位和后面8位交换,完成16位的逆序
2组16位的交换,完成32位的逆序

通过下面的例子,详解上面的过程,我们以16位为例:10000110 11011000

1 0 0 0 0 1 1 0 1 1 0 1 1 0 0 0
0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0
0 0 0 1 0 1 1 0 1 0 1 1 0 0 0 1
0 1 1 0 0 0 0 1 0 0 0 1 1 0 1 1
0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 1

经过4步,逆序完成。推而广之,总的时间复杂度为O(logn),n是二进制的位数。这个方法可以推广到任意位。

示例代码如下:

int v =111;
v =((v >>1)&0x55555555)|((v &0x55555555)<<1);
v =((v >>2)&0x33333333)|((v &0x33333333)<<2);
v =((v >>4)&0x0F0F0F0F)|((v &0x0F0F0F0F)<<4);
v =((v >>8)&0x00FF00FF)|((v &0x00FF00FF)<<8);
v =( v >>16)|( v <<16);System.out.println(v);上面的思路理解了,代码不难理解。例如第二行,前边是取偶数位,后面是取奇数位,奇数位左移一位,偶数位右移一位,再取或,就是交换了奇数偶数位。也就是第一个步骤。

基于位运算的一些巧妙的方法有很多。大家可以自行研究,后面会和大家分享更多的面试题目。

【分析完毕】

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#递归实现将一整数逆序后放入一数组中
  • c#二进制逆序方法详解

相关文章

  • 2017-05-28获得.net控件的windows句柄的方法
  • 2017-05-28C#使用IComparer自定义List类实现排序的方法
  • 2017-05-28C# 对象持久化详解
  • 2017-05-28C#从文件或标准输入设备读取指定行的方法
  • 2017-05-28C#中实现任意List的全组合算法代码
  • 2017-05-28详解C#中的泛型以及编程中使用泛型的优点
  • 2017-05-28c#之用户定义的数据类型转换介绍
  • 2017-05-28c#动态加载卸载DLL的方法
  • 2017-05-28C#对称加密与非对称加密实例
  • 2017-05-28C#解决汉诺塔问题DEMO

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C# 获取程序集版本、文件版本
    • C#开发Android百度地图手机应用程序(多地图展示)
    • C#中的匿名方法实例解析
    • C#窗体编程不显示最小化、最大化、关闭按钮的方法
    • C#中数组、ArrayList和List三者的区别详解及实例
    • C#中HashTable的定义与使用方法
    • C#实现将数据导出到word或者Excel中的方法
    • c# SQLHelper(for winForm)实现代码
    • C#子线程更新UI控件的方法实例总结
    • C#使用DeflateStream解压缩数据文件的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有