碟式交换:C语言代码实现字节的高低位互换
问题
11010001
,经过0-7,1-6,2-5,3-4对应位的交换,变成10001011
。解决思路
2{
3 unsigned char i;
4 unsigned char tmp=0x00;
5
6 for(i=0;i<8;i++)
7 {
8 tmp=((data>>i)&0x01)|tmp;
9 if(i<7)
10 tmp=tmp<<1;
11 }
12
13 printf(' after shift fun1 data=%x \n',tmp);
14
15 return tmp;
16
17}
蝶式交换法
和查表法
来实现。查表法顾名思义即将一些值存到内存中,需要计算时查表即可,但是也会占用额外的存储空间。这里主要再介绍一下蝶式交换法。所谓的蝶式交换是这样的:
2data=((data<<2)&0xcc)|((data>>2)&0x33);
3data=((data<<1)&0xaa)|((data>>1)&0x55);
假设原始位序列为
0 1 0 1 1 0 0 1
data=(data<<4)|(data>>4);
之后序列为 1 0 0 1 0 1 0 1
data=((data<<2)&0xcc)|((data>>2)&0x33);
之后序列为 0 1 1 0 0 1 0 1
data=((data<<1)&0xaa)|((data>>1)&0x55);
之后序列为1 0 0 1 1 0 1 0 更抽象的来说 原始位为
1 2 3 4 5 6 7 8
data=(data<<4)|(data>>4); 之后位序为
5 6 7 8 1 2 3 4data=((data<<2)&0xcc)|((data>>2)&0x33);
之后位序为 7 8 5 6 3 4 1 2
data=((data<<1)&0xaa)|((data>>1)&0x55);
之后位序为 8 7 6 5 4 3 2 1
由此完成了整个位的逆序转换,下面是具体的实现代码:
2{
3 data=(data<<4)|(data>>4);
4 data=((data<<2)&0xcc)|((data>>2)&0x33);
5 data=((data<<1)&0xaa)|((data>>1)&0x55);
6 printf(' after shift fun2 data=%x \n',data);
7
8 return data;
9}
赞 (0)