[向性欲提问]将一个unsigned short类型前后两个字节相互掉换。

meteora112 2008-04-23 10:16:20
1.很老实的做法
#include <stdio.h>

unsigned short swap_byte(unsigned short i)
{
unsigned short j;

j = i;
j >>= 8;
j &= ~0;
i <<= 8;
i |= 0;
return j + i;

}

main()
{
unsigned short hex_num;
printf("Enter a hexadecimal number: ");
scanf("%hx", &hex_num);
hex_num = swap_byte(hex_num);
printf("Number with byte swapped: %hx\n", hex_num);
return 0;
}

2、比较简便的做法
#include <stdio.h>

unsigned short swap_byte(unsigned short i)
{

return (i >> 8) + (i << 8);
}

main()
{
unsigned short hex_num;
printf("Enter a hexadecimal number: ");
scanf("%hx", &hex_num);
hex_num = swap_byte(hex_num);
printf("Number with byte swapped: %hx\n", hex_num);
return 0;
}

还有什么好办法么?
...全文
786 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
ONLYBLUEMOON 2008-05-01
  • 打赏
  • 举报
回复
这人和人都认识@
UltraBejing 2008-04-30
  • 打赏
  • 举报
回复
我也想知道,正在找這方面的資料~~~~~
lwalwg 2008-04-25
  • 打赏
  • 举报
回复
学习了,我想到的就是位运算,向高手学习了。
。。。
ptwcj 2008-04-25
  • 打赏
  • 举报
回复
哈哈,真逗
ttlyfast 2008-04-24
  • 打赏
  • 举报
回复
xingyu
meteora112 2008-04-24
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 fetag 的回复:]
引用 32 楼 meteora112 的回复:
return (((i >> 8) & 0x00ff) ¦ ((i < < 8) & 0xff00));
无符号数位移为什么还要&0x00ff?

& 0x00ff可以将高八位清零,0xff00可以将低八位清零...
[/Quote]
问题是无符号数啊移位后自动搞0哦,难道这样写只增加可读性?
独孤过儿 2008-04-24
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 meteora112 的回复:]
return (((i >> 8) & 0x00ff)  ¦ ((i  < < 8) & 0xff00));
无符号数位移为什么还要&0x00ff?
[/Quote]
& 0x00ff可以将高八位清零,0xff00可以将低八位清零...
meteora112 2008-04-24
  • 打赏
  • 举报
回复
我的输入法是scim
meteora112 2008-04-24
  • 打赏
  • 举报
回复
return (((i >> 8) & 0x00ff) | ((i << 8) & 0xff00));
无符号数位移为什么还要&0x00ff?
独孤过儿 2008-04-24
  • 打赏
  • 举报
回复
每次看到这标题就忍不住想进来看看,哇哈哈~~~

星羽大哥,看来不光我一个人打错字啊...这应该是你名字本身的问题,要不怎么这么多输入法,大家的执行效果都相同呢...
eduhf_123 2008-04-24
  • 打赏
  • 举报
回复
unsigned short swap_byte(unsigned short i)  
{
return ((i<<8)&0xFF00)¦((i>>8)&0x00FF);
}
eduhf_123 2008-04-24
  • 打赏
  • 举报
回复
unsigned short swap_byte(unsigned short i)
{
return (i<<8)|(i>>8);
}
meteora112 2008-04-24
  • 打赏
  • 举报
回复
都怪我太懒~~~我错了星羽大哥,请版主该名字嘿嘿
meteora112 2008-04-24
  • 打赏
  • 举报
回复
(i >> 8) | (i << 8)
meteora112 2008-04-24
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 Chiyer 的回复:]
C/C++ code
这样也可以

unsigned short swap_byte_3(unsigned short i)
{
unsigned char* p1 = (unsigned char*)&i;
unsigned char* p2 = p1 + 1;
unsigned char t = *p1;
(*p1) = (*p2);
(*p2) = t;
return i;
}
[/Quote]
这2个不错。
babyvox1999 2008-04-24
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 redleaves 的回复:]
我喜欢看这种标题~
[/Quote]
bargio_susie 2008-04-24
  • 打赏
  • 举报
回复
还可以这样吧。。

#include <stdio.h>

union swap
{
struct
{
unsigned int h:8;
unsigned int l:8;
};
unsigned short t;
};


int main()
{
union swap a;
a.t = 0x1234;

a.h ^= a.l;
a.l ^= a.h;
a.h ^= a.l;

printf("%x", a.t);
return 0;
}

dk8478 2008-04-24
  • 打赏
  • 举报
回复
用指针做,将这个unsigned short数据的地址传给一个指针,再将这个指针转换为char *类型,这样这个unsigned short数据的两个字节都可以用指针表示了,再将这两个指针指向的内容对换,就可以实现两个字节相互掉换,具体函数如下:
unsigned short swap_byte(unsigned short i)
{
char *p=(char *)&i;

char temp=*p;
*p=*(p+1);
*(p+1)=temp;

return *(unsigned short *)p;

}
susemm 2008-04-24
  • 打赏
  • 举报
回复
title很诱人,还以为有艳照呢~~~

return (((i >> 8) & 0x00ff) | ((i << 8) & 0xff00));
星羽 2008-04-24
  • 打赏
  • 举报
回复

这样也可以

unsigned short swap_byte_3(unsigned short i)
{
unsigned char* p1 = (unsigned char*)&i;
unsigned char* p2 = p1 + 1;
unsigned char t = *p1;
(*p1) = (*p2);
(*p2) = t;
return i;
}


加载更多回复(31)

70,037

社区成员

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

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