蝶式交换,字节高低位交换
问题
协议要求字节低位在左,高位在右,对每个字节做转换处理,逐个交换其高低位,例如
11010001
,经过0->7,1->6,2->5,3->4
对应位的交换,变成10001011
。
例程
#include <stdio.h>
unsigned char highAndLowShiftHEX(unsigned char data);
void printBin(int n);
int main () {
highAndLowShiftHEX(209);
return 0;
}
unsigned char highAndLowShiftHEX(unsigned char data)
{
unsigned char i;
unsigned char tmp=0x00;
for(i=0;i<8;i++)
{
//tmp=((data>>i)&0x01)|tmp;
tmp |=((data>>i)&0x01);
if(i<7)
tmp=tmp<<1;
}
printf("after shift data:");
printBin(tmp);
return tmp;
}
//打印二进制
void printBin(int n)
{
int len = sizeof(n)*8;//总位数.
int i;
if(i == 0)
{
printf("0");
return;
}
for(i = len-1; i >= 0; i --)//略去高位0.
{
if(n&(1<<i)) break;
}
for(;i>=0; i --)
printf("%d", (n&(1<<i)) != 0);
}
进阶–>蝶式交换
- 蝶式交换
data=(data<<4)|(data>>4);
data=((data<<2)&0xcc)|((data>>2)&0x33);
data=((data<<1)&0xaa)|((data>>1)&0x55);
- 执行演算
原始序列位:1 1 0 1 0 0 0 1
data=(data<<4)|(data>>4); 之后序列:00011101
data=((data<<2)&0xcc)|((data>>2)&0x33); 之后序列:01000111
data=((data<<1)&0xaa)|((data>>1)&0x55);之后序列:10001011
- 流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LYQn0yHV-1615271104150)(G:\笔记\Linux驱动笔记\位操作.assets\image-20201201164856922.png)]
- 例程
#include <stdio.h>
unsigned char highAndLowShiftHEX(unsigned char data);
void printBin(int n);
int main () {
highAndLowShiftHEX(209);
return 0;
}
unsigned char highAndLowShiftHEX(unsigned char data)
{
data=(data<<4)|(data>>4);
data=((data<<2)&0xcc)|((data>>2)&0x33);
data=((data<<1)&0xaa)|((data>>1)&0x55);
printf(" after shift data=%x \n",data);
printBin(data);
return data;
}
//打印二进制
void printBin(int n)
{
int len = sizeof(n)*8;//总位数.
//printf("%ld\n",sizeof(n));
int i;
if(i == 0)
{
printf("0");
return;
}
for(i = len-1; i >= 0; i --)//略去高位0.
{
if(n&(1<<i)) break;
}
for(;i>=0; i --)
printf("%d", (n&(1<<i)) != 0);
}
扩展
16位半字高低位交换
正常思路,由上8位代码扩展
#include <stdio.h>
void expandPrintBin(int val2);
unsigned short HighAndLowSwitchHEX(unsigned short data);
int main () {
HighAndLowSwitchHEX(38491);
return 0;
}
//打印二进制的函数
void expandPrintBin(int val2)
{
int i,k;
unsigned char *p = (unsigned char*)&val2 + 3; //从低位到高位,低端字节计算机
for( k = 0; k <= 3; k++)
{
int val2 = *(p-k);
for (i = 7; i >= 0; i--)
{
if(val2 & (1 << i))
printf("1");
else
printf("0");
}
printf(" ");
}
}
unsigned short HighAndLowSwitchHEX(unsigned short data)
{
unsigned char i = 0;
unsigned short temp = 0x0000;
for(i = 0; i < 16; i++)
{
temp = ((data >> i) & 0x0001) | temp;
if(i < 15)
{
temp = temp << 1;
}
}
printf("temp:%x\n\n",temp);
expandPrintBin(temp);
return temp;
}
蝶式交换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vpvy0zWZ-1615271104152)(G:\笔记\Linux驱动笔记\位操作.assets\image-20201201175521903.png)]
#include <stdio.h>
unsigned short highAndLowShiftHEX(unsigned short data);
void expandPrintBin(int val2);
int main () {
highAndLowShiftHEX(38491);
return 0;
}
unsigned short highAndLowShiftHEX(unsigned short data)
{
data = (data << 8) | (data >> 8); //0101101110010110
data = ((data << 4) & 0xF0FF) | ((data >> 4) & 0xFF0F); //1011010101101001
data = ((data << 2) & 0xCCCC) | ((data >> 2) & 0x3333); //1110010110010110
data = ((data << 1) & 0xAAAA) | ((data >>1 ) & 0x5555); //1101101001101001
printf(" after shift data=%x \n",data);
expandPrintBin(data);
return data;
}
//打印二进制的函数
void expandPrintBin(int val2)
{
int i,k;
unsigned char *p = (unsigned char*)&val2 + 3; //从低位到高位,低端字节计算机
for( k = 0; k <= 3; k++)
{
int val2 = *(p-k);
for (i = 7; i >= 0; i--)
{
if(val2 & (1 << i))
printf("1");
else
printf("0");
}
printf(" ");
}
}