您好、欢迎来到现金彩票网!
当前位置:2019跑狗图高清彩图 > 先行算法 >

c语言实现bit反转的最佳算法-从msb-lsb到l-m

发布时间:2019-07-10 09:34 来源:未知 编辑:admin

  具体的转换是从MSB-LSB到LSB-MSB, 所有的Bit都必须反转,那意味着,这并不是字节顺序的交换。

  注意: 下面的算法都用C实现,但应该可以迁移到其它语言(只是不那么快的时候可别找我)。

  你可以扩展这个算法到64位int的场景,或者为了更快的速度而牺牲多一些的内存(假设你的L1数据缓存足够大),有一个64K的查找表且每次反转16位。

  如果你想在32位int环境这样做,那么只需要把每一个byte反转,然后再颠倒byte的次序即可。如下:

  我测试了两个最有效的方案,查找表和按位与(第一个方案)。测试机器为一台笔记本电脑,配置为4G DDR2内存,2.4GHz的双核T7500处理器,4MB的L2缓存。我使用的是gcc 4.3.2,64位Linux。OpenMP(外加GCC绑定)被用来提高计时器的调度能力。

  在不同的优化级别(Optimizations),两个方案我都尝试了,每个级别跑3个案例,每个案例反转1亿个随机的无符号整数。对于查找表方案,bitwise hacks page上面的两种方法(Option 1 and Option 2)我都测试过。结果如下:

  如果你比较在意性能,那么使用查找表Option 1(Byte的寻址不出意外的慢)。如果你需要尽可能的利用完每一个Byte内存(且你也在意bit反转的性能),那么优化后的按位与方案也还不赖。

  我知道上面的代码只是一个粗略的版本,非常欢迎大家提供一些优化的建议。以下是我知道的几点:

  对 -O2/-O3(发生符号重定义的错误)无效,所以我不相信产生的代码是为我的微架构而优化。

  SSE环境下应该有一种方法处理得更快。我不知道怎么做,但又更快的内存复制,批量的按位与,调整的指令集, 总是有一些手段的。

  我知道仅仅x86的指令集是危险的,下面是GCC在-O3环境产生的代码,所以比我更厉害的大牛可以检查一下。

  更改: 我也尝试在自己机器上使用uint64,看看是否性能有所提高。相对于32-bit性能大概提高了10%。无论你是每次用64-bit类型去反转2个32-bit的int,或者实际上看作64-bit并分两次来反转,性能都大致相当。代码如下(对于前者,每次反转2个32-bit的int):

  最近在写一个短信下发功能,客户端使用c#和java的短信网关的进行网络通信。之前使用java进行开发,一切正常,改用c#无法收到网关应答。想了半天意识到是不是网络字节序问题,java默认就是大端字节序...博文来自:编码改变世界

  其实就是little endian和big endian的问题 2字节之间的反转相当于htons 四字节的相当于htonl 但八字节的没有现成函数吧 究竟是全把他们当作字节,然后前后颠倒快,还是像ht论坛

  0x01题目来源下载后可以本地进行做题。0x02解题思路1、首先看到CBC的解密模式这里可以看...博文来自:jeffreynnn的博客

  一、什么是先行发生原则二、Java内存模型中的先行发生关系三、如何应用先行发生规则如果Java内存模型中所有的有序性都仅仅靠volatile和synchronized来完成,那么有一些操作将会变得很烦...博文来自:栋先生

  工作当中偶尔会出现DDR内存翻转造成业务流程出错问题。今天一个朋友突然想到如何人为的将DDR任意bit翻转,感觉挺有意思,写了一个小程序。由于是在PC上模拟测试,所以用变量来代替DDR地址。实现嵌入式...博文来自:fengliang191的专栏

  通过一道题了解CBC翻转攻击CBC翻转攻击方法的精髓在于:通过损坏密文字节来改变明文字节。(注:借助CBC内部的模式)借由此可以绕过过滤器,或者改变用户权限提升至管理员,又或者改变应用程序预期明文以尽...博文来自:csu_vc的博客

  二进制逆序原文二进制逆序,顾名思义就是将低位和高位交换,例如0x23=00100011B,逆序后就是11000100B。字节反转在“小端”格式和“大端”格式之间的数据转换是一个必要的操作。...博文来自:寒冬向着西北的窗

  题目要求如题所示:将一个字符按bit位逆序,例如一个字节是0x11,将其逆序后就变成0x88。下面是四种解法,其中最后一种效率最高,是从《Hackers Delight》这本书中学来的。第一种:看似创...博文来自:Enjoying ...

  前几天做了一道面试题,题目是将一个字符的位翻转,例如0b01001101–0b10110010首先我想到的是转化为字符串,然后使用字符串的翻转,编程毕竟不是数学证明题,把未知转换为已经证明过的已知,...博文来自:StepByStepTo的专栏

  这几天零星做到了一些跟正整数位有关的操作的题目,就常见的就是异或,都需要O(n)O(n)的时间复杂度。所以把这些题目总结一下。477.TotalHammingDistance数字二进制的Hamming...博文来自:haolexiao的专栏

  写了这么久的代码,一直没怎么了解底层,由于要按bit反转数据,所以查到了如下信息:里面还有大小端转换,以前自己写大小端转换,线、REVSH和RBIT在字或半字...博文来自:忍者工作室

  好久没用过位操作,都不记得怎么用了,手上又没有合适的参考资料,哪位大虾帮忙指点一下!3ks!论坛

  reg a a表示一个四位的寄存器变量 reg b b表示一个五位的寄存器变量 定义的寄存器位数难道就是他们的差?为什么还有不同的起始点呢?这到底意味着什么呢?论坛

  我的知识来源于书本,工作,互联网,因此,我也应该把我学到的知识分享出来,与志同道合的朋友互相交流。这是我坚持学blog的原因所在。 在写程序的过程中,我们或许会遇到这样的需求,将某一位进行反转,或者是...博文来自:代码菌的blog

  使用有限的内存操作完成字节中的位反转。完成后,修改代码让它运行得尽可能快(但没有内存限制) 优化和正确性相比,总是居于次要位置。uint8_t  SwapBitsInByte(uint8_t  inp...博文来自:停止更新,迁移至/span>

  一串二进制数从左往右数,最高位为MSB,最右为LSB;我们知道一个data是有unsigned和signed之分,以及32位或是64位等区别。这里我以16位的有符号位二进制数为例,用C语言实际操作一串...博文来自:jsdchenye的专栏

  处理点阵显示的时候涉及到了MSBLSB的转换,于是在找了些大神的资料文中的方法是针对32位...博文来自:hackercircle的博客

  大端(Big-endian):数据的高位字节存放在地址的低端低位字节存放在地址高端;小端(Little-endian):数据的高位字节存放在地址的高端低位字节存放在地址低端;举个简单而又容易理解的例子...博文来自:anbaixiu的博客

  为何一些项目中的消息协议经常以0xEB作为报文头,0x03作为结尾?这两个值有什么特别?论坛

  一、SPI协议简介SPI协议是由摩托罗拉公司提出的通讯协议(SerialPeripheralInterface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与...博文来自:zxh1592000的博客

  首先要知道这个数的二进制转化,要实现从左到右的翻转,要么让二进制数从后往前移位,要么就是从后往前读每一位都乘以2^(32-i),最后相加就行了。举例说明吧:如在32位机器上15这个值包含下列各位:00...博文来自:ret_skd的专栏

  #include//bit_reverse:32位数按位反转函数// 作用:把一个32位整数按位反转,即第1位转到第32位,第2位转到第31位,依次下去。//算法实现:第一行代码为奇偶位相互交换;第二...博文来自:Android/Linux的专栏

  写给嵌入式程序员的循环冗余校验(CRC)算法入门引导前言CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式。在嵌入式软件开发中,经常要用到CRC算法对各种数据进行校验。因此,掌握基本的CRC算法...博文来自:Ivan 的专栏

  源自某公司的一道试题,问题很简单:输入一个字节(8bits),将其按位反序。也就是说如果输入字节的八个比...博文来自:菲利克斯猫(Felix.mao)的IT技术专栏

  一、实验内容实验完成形式: 用MATLAB函数实现LSB信息隐藏和提取实验选择载体: 512×512灰度图像实验效果和分析: 1.完成基本的LSB信息隐藏及提取2.能随机选择嵌入位进行信息隐藏及提取(...博文来自:wmren

  最低有效位(theleastsignificantbit,lsb)是指一个二进制数字中的第0位(即最低位),具有权值为2^0,可以用它来检测数的奇偶性。与之相反的称之为最高有效位。在大端序中,lsb指...博文来自:不积跬步,无以至千里

  1.BitMap算法简介     来自于《编程珠玑》。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可...博文来自:wang_zhenwei的博客

  **字节序(byteorder)和位序(bitorder)**lxg@2015/4/27在网络编程中经常会提到网络字节序和主机序,也就是说当一个对象由多个字节组成的时候需要注意对象的多个字节在内存中的...博文来自:liuxingen的专栏

  帐号相关流程注册范围n企业n政府n媒体n其他组织换句话讲就是不让个人开发者注册。 :)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账...博文来自:小雨同学的技术博客

  jquery/js实现一个网页同时调用多个倒计时(最新的)nn最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦!nnnn//jsn...博文来自:Websites

  command窗口是命令窗口,即为sqplus窗口,有命令提示符,识别sqlplus命令,基本的命令都可以执行nsql仅可执行DDL、select、DML等...博文来自:Ape55的博客

  对象的创建和销毁在一定程度上会消耗系统的资源,虽然jvm的性能在近几年已经得到了很大的提高,对于多数对象来说,没有必要利用对象池技术来进行对象的创建和管理。但是对于有些对象来说,其创建的代价还是比较昂...博文来自:赶路人儿

  扫二维码关注,获取更多技术分享nnn 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...博文来自:Marswill

  记得很早以前公司项目中添加过移动支付这一块, 包括微信,支付宝,银联等第三方的整合。 但是后来懒于总结就没留下什么, 最近公司项目打算添加,所以打算简单总结一下,记上一笔以备将来使用。 毕竟第三方的支...博文来自:samuelnotes的专栏

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...博文来自:Lynn_Blog

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗!nnDocker的三大核心概念:镜像、容器、仓库n镜像:类似虚拟机的镜像、用俗话说就是安装文件。n容器:类似一个轻量...博文来自:我走小路的博客

  u011674023:写的很好,那么我本地搭建了私服也连外网了,怎么保证其下下来的东西没有病毒呢?

  weixin_38943098:大概看懂到了,又有点迷糊,但看大家都在喊666,不明觉厉...

http://jubileeny.net/xianxingsuanfa/356.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有