open watcom学习记录之——字节序交换,另一帖回复满了

cxdzxc 2012-06-10 08:05:36
int swap32_1(int i)
{
return ((i&0xff000000)>>24)|((i&0xff0000)>>8)|((i&0xff00)<<8)|((i&0xff)<<24);
}

int swap(int x)
{
int out,i;
char *p_in=(char*)&x,*p_out=(char*)&out;
while (i<sizeof(int))
p_out[i++]=p_in[sizeof(int)-1-i];/*赋值运算先算右面,所以要把i++放在左面*/
return out;
}

int bswap(int x)
{
int ret;
/*psrc指向x首字节,pdst指向ret之后*/
char *psrc=(char*)&x,*pdst=(char*)(&ret+1);
while(pdst>(char*)&ret)
*--pdst=*psrc++;
return ret;
}

main()
{
int a=0x12345678;
printf("a=%x\n",a);
a=swap32_1(a);
printf("swap32_1--->%x\n",a);
a=0x12345678;
a=swap(a);
printf("swap--->%x\n",a);
a=0x12345678;
a=bswap(a);
printf("bswap--->%x",a);
}
...全文
129 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxdzxc 2012-06-15
  • 打赏
  • 举报
回复
居然发重了,汗!
输出:
a=12345678
byte_swap32--->78563412
byte_swap1---->78563421
byte_swap2--->78563412
byte_swap3--->78563412

halfbyte_swap32--->87654321
halfbyte_swap1---->87654321
halfbyte_swap2--->87654321
halfbyte_swap3--->87654321

bit_swap1--->1e6a2c48
bit_swap2--->1e6a2c48
bit_swap3--->1e6a2c48

char c=0xc1
char_bit_swap=0x83
cxdzxc 2012-06-15
  • 打赏
  • 举报
回复
增加新的方法,继续汇总:
int byte_swap32(int i)
{
return ((i&0xff000000)>>24)|((i&0xff0000)>>8)|((i&0xff00)<<8)|((i&0xff)<<24);
}

int byte_swap1(int in)
{
int out,i=0;
char *p_in=(char*)&in,*p_out=(char*)&out;
while (i<sizeof(int))
p_out[i++]=p_in[sizeof(int)-1-i];/*赋值运算先算右面,所以要把i++放在左面,注意c4droid却是相反的*/
return out;
}

int byte_swap2(int in)
{
int ret;
/*psrc指向in首字节,pdst指向ret之后*/
char *psrc=(char*)&in,*pdst=(char*)(&ret+1);
while(pdst>(char*)&ret)
*--pdst=*psrc++;
return ret;
}

unsigned byte_swap3(unsigned in)
{
unsigned out=0,byte_num=sizeof(in);
while(byte_num--)
{
out |= (in & 0xff)<<byte_num*8;
in >>= 8;
}
return out;
}

int halfbyte_swap32(int i)
{
return ((i&0xf0000000)>>28)|((i&0xf000000)>>20)|((i&0xf00000)>>12)|((i&0xf0000)>>4)|((i&0xf000)<<4|((i&0xf00)<<12)|((i&0xf0)<<20|((i&0xf)<<28)));
}

int halfbyte_swap1(int in)
{
int out,i=0;
char *p_in=(char*)&in,*p_out=(char*)&out;
while (i<sizeof(int))
p_out[i++]=(p_in[sizeof(int)-1-i]<<4)|(p_in[sizeof(int)-1-i]>>4);/*赋值运算先算右面,所以要把i++放在左面,注意c4droi却是相反的*/
return out;
}

int halfbyte_swap2(int in)
{
int ret;
/*psrc指向in首字节,pdst指向ret之后*/
char *psrc=(char*)&in,*pdst=(char*)(&ret+1);
while(pdst>(char*)&ret)
{
*--pdst=(*psrc<<4)|(*psrc>>4);
psrc++;
}
return ret;
}

unsigned halfbyte_swap3(unsigned in)
{
unsigned out=0,byte_num=sizeof(in)*(8/4);
while(byte_num--)
{
out |= (in & 0xf)<<byte_num*4;
in >>= 4;
}
return out;
}

int bit_swap1(int in)
{
int bit_num=sizeof(in)*8,out=0;
while(bit_num)
{
if (in&(1<<(bit_num-1)))
{
out|=(1<<(sizeof(in)*8-bit_num));
}
bit_num--;
}
return out;
}

unsigned bit_swap2(unsigned in)
{
unsigned bit_num=sizeof(in)*8,out=0;
while(bit_num--)
{
out |= (in & 1)<<bit_num;
in >>= 1;
}
return out;
}

unsigned bit_swap3(unsigned in)
{
in = ((in>>16) & 0x0000ffff) | ((in<<16) & 0xffff0000);
in = ((in>>8) & 0x00ff00ff) | ((in<<8) & 0xff00ff00);
in = ((in>>4) & 0x0f0f0f0f) | ((in<<4) & 0xf0f0f0f0);
in = ((in>>2) & 0x33333333) | ((in<<2) & 0xcccccccc);
in = ((in>>1) & 0x55555555) | ((in<<1) & 0xaaaaaaaa);
return in;
}

char char_bit_swap(char in)
{
return (in&0x80)>>7|(in&0x40)>>5|(in&0x20)>>3|(in&0x10)>>1|(in&0x8)<<1|(in&0x4)<<3|(in&0x2)<<5|(in&0x1)<<7;
}

main()
{
int a=0x12345678;
char c=0xc1;
printf("a=%x\n",a);
printf("byte_swap32--->%x\n",byte_swap32(a));
printf("byte_swap1---->%x\n",byte_swap1(a));
printf("byte_swap2--->%x\n",byte_swap2(a));
printf("byte_swap3--->%x\n\n",byte_swap3(a));

printf("halfbyte_swap32--->%x\n",halfbyte_swap32(a));
printf("halfbyte_swap1---->%x\n",halfbyte_swap1(a));
printf("halfbyte_swap2--->%x\n",halfbyte_swap2(a));
printf("halfbyte_swap3--->%x\n\n",halfbyte_swap3(a));

printf("bit_swap1--->%x\n",bit_swap1(a));
printf("bit_swap2--->%x\n",bit_swap2(a));
printf("bit_swap3--->%x\n\n",bit_swap3(a));

printf("char c=0x%x\n",c);
printf("char_bit_swap=0x%x",char_bit_swap(c));
}
cxdzxc 2012-06-15
  • 打赏
  • 举报
回复
增加新的方法,继续汇总:
int byte_swap32(int i)
{
return ((i&0xff000000)>>24)|((i&0xff0000)>>8)|((i&0xff00)<<8)|((i&0xff)<<24);
}

int byte_swap1(int in)
{
int out,i=0;
char *p_in=(char*)&in,*p_out=(char*)&out;
while (i<sizeof(int))
p_out[i++]=p_in[sizeof(int)-1-i];/*赋值运算先算右面,所以要把i++放在左面,注意c4droid却是相反的*/
return out;
}

int byte_swap2(int in)
{
int ret;
/*psrc指向in首字节,pdst指向ret之后*/
char *psrc=(char*)&in,*pdst=(char*)(&ret+1);
while(pdst>(char*)&ret)
*--pdst=*psrc++;
return ret;
}

unsigned byte_swap3(unsigned in)
{
unsigned out=0,byte_num=sizeof(in);
while(byte_num--)
{
out |= (in & 0xff)<<byte_num*8;
in >>= 8;
}
return out;
}

int halfbyte_swap32(int i)
{
return ((i&0xf0000000)>>28)|((i&0xf000000)>>20)|((i&0xf00000)>>12)|((i&0xf0000)>>4)|((i&0xf000)<<4|((i&0xf00)<<12)|((i&0xf0)<<20|((i&0xf)<<28)));
}

int halfbyte_swap1(int in)
{
int out,i=0;
char *p_in=(char*)&in,*p_out=(char*)&out;
while (i<sizeof(int))
p_out[i++]=(p_in[sizeof(int)-1-i]<<4)|(p_in[sizeof(int)-1-i]>>4);/*赋值运算先算右面,所以要把i++放在左面,注意c4droi却是相反的*/
return out;
}

int halfbyte_swap2(int in)
{
int ret;
/*psrc指向in首字节,pdst指向ret之后*/
char *psrc=(char*)&in,*pdst=(char*)(&ret+1);
while(pdst>(char*)&ret)
{
*--pdst=(*psrc<<4)|(*psrc>>4);
psrc++;
}
return ret;
}

unsigned halfbyte_swap3(unsigned in)
{
unsigned out=0,byte_num=sizeof(in)*(8/4);
while(byte_num--)
{
out |= (in & 0xf)<<byte_num*4;
in >>= 4;
}
return out;
}

int bit_swap1(int in)
{
int bit_num=sizeof(in)*8,out=0;
while(bit_num)
{
if (in&(1<<(bit_num-1)))
{
out|=(1<<(sizeof(in)*8-bit_num));
}
bit_num--;
}
return out;
}

unsigned bit_swap2(unsigned in)
{
unsigned bit_num=sizeof(in)*8,out=0;
while(bit_num--)
{
out |= (in & 1)<<bit_num;
in >>= 1;
}
return out;
}

unsigned bit_swap3(unsigned in)
{
in = ((in>>16) & 0x0000ffff) | ((in<<16) & 0xffff0000);
in = ((in>>8) & 0x00ff00ff) | ((in<<8) & 0xff00ff00);
in = ((in>>4) & 0x0f0f0f0f) | ((in<<4) & 0xf0f0f0f0);
in = ((in>>2) & 0x33333333) | ((in<<2) & 0xcccccccc);
in = ((in>>1) & 0x55555555) | ((in<<1) & 0xaaaaaaaa);
return in;
}

char char_bit_swap(char in)
{
return (in&0x80)>>7|(in&0x40)>>5|(in&0x20)>>3|(in&0x10)>>1|(in&0x8)<<1|(in&0x4)<<3|(in&0x2)<<5|(in&0x1)<<7;
}

main()
{
int a=0x12345678;
char c=0xc1;
printf("a=%x\n",a);
printf("byte_swap32--->%x\n",byte_swap32(a));
printf("byte_swap1---->%x\n",byte_swap1(a));
printf("byte_swap2--->%x\n",byte_swap2(a));
printf("byte_swap3--->%x\n\n",byte_swap3(a));

printf("halfbyte_swap32--->%x\n",halfbyte_swap32(a));
printf("halfbyte_swap1---->%x\n",halfbyte_swap1(a));
printf("halfbyte_swap2--->%x\n",halfbyte_swap2(a));
printf("halfbyte_swap3--->%x\n\n",halfbyte_swap3(a));

printf("bit_swap1--->%x\n",bit_swap1(a));
printf("bit_swap2--->%x\n",bit_swap2(a));
printf("bit_swap3--->%x\n\n",bit_swap3(a));

printf("char c=0x%x\n",c);
printf("char_bit_swap=0x%x",char_bit_swap(c));
}
赵4老师 2012-06-14
  • 打赏
  • 举报
回复
凑个热闹
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int v;
int bitrev1(const int b) {
register int n;

n=b;
n=((n>> 1)&0x55555555)|((n<< 1)&0xaaaaaaaa);
n=((n>> 2)&0x33333333)|((n<< 2)&0xcccccccc);
n=((n>> 4)&0x0f0f0f0f)|((n<< 4)&0xf0f0f0f0);
n=((n>> 8)&0x00ff00ff)|((n<< 8)&0xff00ff00);
n=((n>>16)&0x0000ffff)|((n<<16)&0xffff0000);
return n;
}
int bitrev2(const int b) {
__asm {
push ebx
push ecx
mov ebx,b
mov ecx,32
nextbit:
rcl ebx,1
rcr eax,1
loop nextbit
pop ecx
pop ebx
}
}
int bitrev3(const int b) {
char bs[33],bs1[33],*ep;

itoa(b,bs1,2);
sprintf(bs,"%032s",bs1);
strrev(bs);
return strtol(bs,&ep,2);
}
void main() {
v=0x12345678;//0001 0010 0011 0100 0101 0110 0111 1000
printf("%08x\n",bitrev1(v));
printf("%08x\n",bitrev2(v));
printf("%08x\n",bitrev3(v));
}
//1e6a2c48
//1e6a2c48
//1e6a2c48
cxdzxc 2012-06-14
  • 打赏
  • 举报
回复
增加一个位反序输出函数,各种方法汇总下
int byte_swap32(int i)
{
return ((i&0xff000000)>>24)|((i&0xff0000)>>8)|((i&0xff00)<<8)|((i&0xff)<<24);
}

int byte_swap1(int in)
{
int out,i=0;
char *p_in=(char*)&in,*p_out=(char*)&out;
while (i<sizeof(int))
p_out[i++]=p_in[sizeof(int)-1-i];/*赋值运算先算右面,所以要把i++放在左面*/
return out;
}

int byte_swap2(int in)
{
int ret;
/*psrc指向in首字节,pdst指向ret之后*/
char *psrc=(char*)&in,*pdst=(char*)(&ret+1);
while(pdst>(char*)&ret)
*--pdst=*psrc++;
return ret;
}

int halfbyte_swap32(int i)
{
return ((i&0xf0000000)>>28)|((i&0xf000000)>>20)|((i&0xf00000)>>12)|((i&0xf0000)>>4)|((i&0xf000)<<4|((i&0xf00)<<12)|((i&0xf0)<<20|((i&0xf)<<28)));
}

int halfbyte_swap1(int in)
{
int out,i=0;
char *p_in=(char*)&in,*p_out=(char*)&out;
while (i<sizeof(int))
p_out[i++]=(p_in[sizeof(int)-1-i]&0xf)<<4|(p_in[sizeof(int)-1-i]&0xf0)>>4;/*赋值运算先算右面,所以要把i++放在左面*/
return out;
}

int halfbyte_swap2(int in)
{
int ret;
/*psrc指向in首字节,pdst指向ret之后*/
char *psrc=(char*)&in,*pdst=(char*)(&ret+1);
while(pdst>(char*)&ret)
{
*--pdst=(*psrc&0xf)<<4|(*psrc&0xf0)>>4;
psrc++;
}
return ret;
}

int int_bit_swap(int in)
{
int bit_num=sizeof(in)*8,out=0;
while(bit_num)
{
if (in&(1<<(bit_num-1)))
{
out|=(1<<(sizeof(in)*8-bit_num));
}
bit_num--;
}
return out;
}

char char_bit_swap(char in)
{
return (in&0x80)>>7|(in&0x40)>>5|(in&0x20)>>3|(in&0x10)>>1|(in&0x8)<<1|(in&0x4)<<3|(in&0x2)<<5|(in&0x1)<<7;
}

main()
{
int a=0x12345678,b=a;
char c=0xc1;
printf("a=%x\n",a);
a=byte_swap32(a);
printf("byte_swap32--->%x\n",a);
a=b;
a=byte_swap1(a);
printf("byte_swap1--->%x\n",a);
a=b;
a=byte_swap2(a);
printf("byte_swap2--->%x\n\n",a);

a=b;
printf("a=%x\n",a);
a=halfbyte_swap32(a);
printf("halfbyte_swap32--->%x\n",a);
a=b;
a=halfbyte_swap1(a);
printf("halfbyte_swap1--->%x\n",a);
a=b;
a=halfbyte_swap2(a);
printf("halfbyte_swap2--->%x\n",a);
a=b;
a=int_bit_swap(a);
printf("int_bit_swap--->%x\n",a);

printf("char c=0x%x\n",c);
c=char_bit_swap(c);
printf("char_bit_swap=0x%x",c);
}

cxdzxc 2012-06-13
  • 打赏
  • 举报
回复
int swap32_1(int i)
{
return ((i&0xff000000)>>24)|((i&0xff0000)>>8)|((i&0xff00)<<8)|((i&0xff)<<24);
}

int swap1(int in)
{
int out,i=0;
char *p_in=(char*)&in,*p_out=(char*)&out;
while (i<sizeof(int))
p_out[i++]=p_in[sizeof(int)-1-i];/*赋值运算先算右面,所以要把i++放在左面*/
return out;
}

int bswap1(int in)
{
int ret;
/*psrc指向in首字节,pdst指向ret之后*/
char *psrc=(char*)&in,*pdst=(char*)(&ret+1);
while(pdst>(char*)&ret)
*--pdst=*psrc++;
return ret;
}

int swap32_2(int i)
{
return ((i&0xf0000000)>>28)|((i&0xf000000)>>20)|((i&0xf00000)>>12)|((i&0xf0000)>>4)|((i&0xf000)<<4|((i&0xf00)<<12)|((i&0xf0)<<20|((i&0xf)<<28)));
}

int swap2(int in)
{
int out,i=0;
char *p_in=(char*)&in,*p_out=(char*)&out;
while (i<sizeof(int))
p_out[i++]=(p_in[sizeof(int)-1-i]&0xf)<<4|(p_in[sizeof(int)-1-i]&0xf0)>>4;/*赋值运算先算右面,所以要把i++放在左面*/
return out;
}

int bswap2(int in)
{
int ret;
/*psrc指向in首字节,pdst指向ret之后*/
char *psrc=(char*)&in,*pdst=(char*)(&ret+1);
while(pdst>(char*)&ret)
{
*--pdst=(*psrc&0xf)<<4|(*psrc&0xf0)>>4;
psrc++;
}
return ret;
}

main()
{
int a=0x12345678;
printf("a=%x\n",a);
a=0x12345678;
a=bswap1(a);
printf("bswap1--->%x\n",a);
a=0x12345678;
a=swap1(a);
printf("swap1--->%x\n",a);
a=0x12345678;
a=swap32_1(a);
printf("swap32_1--->%x\n\n",a);

a=0x12345678;
printf("a=%x\n",a);
a=bswap2(a);
printf("bswap2--->%x\n",a);
a=0x12345678;
a=swap2(a);
printf("swap2--->%x\n",a);
a=0x12345678;
a=swap32_2(a);
printf("swap32_2--->%x\n",a);
}
cxdzxc 2012-06-10
  • 打赏
  • 举报
回复
上面swap函数中i未赋初值
改下
int swap32_1(int i)
{
return ((i&0xff000000)>>24)|((i&0xff0000)>>8)|((i&0xff00)<<8)|((i&0xff)<<24);
}

int swap(int x)
{
int out,i=0;
char *p_in=(char*)&x,*p_out=(char*)&out;
while (i<sizeof(int))
p_out[i++]=p_in[sizeof(int)-1-i];/*赋值运算先算右面,所以要把i++放在左面*/
return out;
}

int bswap(int x)
{
int ret;
/*psrc指向x首字节,pdst指向ret之后*/
char *psrc=(char*)&x,*pdst=(char*)(&ret+1);
while(pdst>(char*)&ret)
*--pdst=*psrc++;
return ret;
}

main()
{
int a=0x12345678;
printf("a=%x\n",a);
a=swap32_1(a);
printf("swap32_1--->%x\n",a);
a=0x12345678;
a=swap(a);
printf("swap--->%x\n",a);
a=0x12345678;
a=bswap(a);
printf("bswap--->%x",a);
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧