标题: 完成8位数据高低位交换只需三步的代码 [打印本页]

作者: LQMEI    时间: 2013-4-21 17:09
标题: 完成8位数据高低位交换只需三步的代码

蝶式交换法代码:

unsigned char shift_fun2(unsigned char data)

{

data=(data<<4)|(data>>4);

data=((data<<2)&0xcc)|((data>>2)&0x33);

data=((data<<1)&0xaa)|((data>>1)&0x55);

return data;

}

在遇到交换字节位的问题时使用蝶式交换法和查表法来实现。查表法顾名思义即将一些值存到内存中

需要计算时查表即可但是也会占用额外的存储空间。这里主要介绍一下蝶式交换法

设原始位为 1234  5678

data=(data<<4)|(data>>4);                          之后位序为 5678   1234

data=((data<<2)&0xcc)|((data>>2)&0x33);    之后位序为 7856   3412

data=((data<<1)&0xaa)|((data>>1)&0x55);    之后位序为 8765    4321

由此完成了整个位的逆序转换

[此贴子已经被作者于2013-4-21 17:09:46编辑过]

作者: ahshmj    时间: 2013-4-22 13:12

........

[此贴子已经被作者于2013-4-22 13:14:11编辑过]

作者: lizhendong    时间: 2017-11-15 21:14
太好了,正要找的,谢谢了
作者: sinxcosx    时间: 2018-1-13 11:17
代码少,难看明白的代码还是少用好
作者: hk0506    时间: 2018-8-6 15:07
sinxcosx 发表于 2018-1-13 11:17
代码少,难看明白的代码还是少用好

来来  给你解释一下
设原始位为 1234  5678
data=(data<<4)|(data>>4);  //data<<4,数据左移4位,5678 000;data>>4,数据右移4位,0000 1234;|按位或  ,                      之后位序为 5678   1234
data=((data<<2)&0xcc)|((data>>2)&0x33); 5678 1234  data<<2左移2位,7812 3400;&按位与1100 1100,得7800 3400;data>>2,右移两位,0056 7812,位与0011 0011,得0056 0012;位或之后位序为 7856   3412
data=((data<<1)&0xaa)|((data>>1)&0x55); 7856 3412左移一位8563 4120,位与1010 1010得8060 4020;右移一位 0785 6341,位与0101 0101得0705 0301,;位或之后位序为 8765    4321

作者: JK_L    时间: 2021-8-4 14:25
hk0506 发表于 2018-8-6 15:07
来来  给你解释一下
设原始位为 1234  5678
data=(data4);  //data4,数据右移4位,0000 1234;|按位或  ...

这里,有data的作用域问题,
作者: iClass263    时间: 2021-12-5 20:27
阿这...学到了,牛
作者: li64331218    时间: 2023-3-20 12:56
傅里叶算法可以用到

作者: xuxiaojian    时间: 2023-3-23 20:36
hk0506 发表于 2018-8-6 15:07
来来  给你解释一下
设原始位为 1234  5678
data=(data4);  //data4,数据右移4位,0000 1234;|按位或  ...

太牛了吧

作者: 指北针    时间: 2024-5-28 18:01
这是咋想出来的?
作者: liuzx66    时间: 2024-5-29 13:17

作者: nearsea    时间: 2024-6-10 16:53
有没有算过能传统两字节左移右移快多少?
作者: 电子辉    时间: 2024-9-11 16:55
为什么不用结构+联合,想换都行,何必搞这么复杂




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1