问题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} 蝶式交换法 和查表法 来实现。查表法顾名思义即将一些值存到内存中,需要计算时查表即可,但是也会占用额外的存储空间。这里主要再介绍一下蝶式交换法。所谓的蝶式交换是这样的:
假设原始位序列为 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} |
|
来自: 西北望msm66g9f > 《编程》