uint型变量倒转问题。

sutine 2005-09-08 12:23:57
各位,我想请问个问题。

我现在有一个uint型的变量。
也就是32位。比如它四个八位的排列顺序是
1 2 3 4
我现在想把它转成
4 3 2 1

我能想到的办法,就是按位与,然后移位,然后按位或。
就是用四个数0xf000,0x0f00,0x00f0,0x000f分别与它相与,
然后再把结果移位移到相应位置,然后相或。

这是最原始的想法,比较肤浅。
不过我记得还有一种巧妙的方法,以前印象比较深刻,现在就是想不起来了。-_-#
各位有什么好的做法,尽管扔过来,先谢过了。^_^
...全文
144 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocai0001 2005-09-08
  • 打赏
  • 举报
回复
一句话搞定

#define SWAPLONG(y) ((((y)&0xff)<<24) | (((y)&0xff00)<<8) | (((y)&0xff0000)>>8) | (((y)>>24)&0xff))

[注:以上代码出自libpcap库文件实现]
sutine 2005-09-08
  • 打赏
  • 举报
回复
private uint UintConvert( uint uint_32)
{
uint temp8 = 0;
uint temp16 = 0;
uint temp24 = 0;
uint temp32 = 0;

temp8 = (uint_32 & 0xff000000) >> 24;
temp16 = (uint_32 & 0x00ff0000) >> 8;
temp24 = (uint_32 & 0x0000ff00) << 8;
temp32 = (uint_32 & 0x000000ff) << 24;

return temp8 | temp16 | temp24 | temp32;
}

以上是根据我的思路用C#实现的结果,也就是用四个数。分别取得各个字节,然后移位,然后相或。
功能是实现了,不过总觉得这种方法好肤浅。我记得还有一种很巧妙的方法的,就是想不起来。
虽然现在计算机性能不至于对几个字节几个机器周期都那么苛刻,但我们还是要精益求精嘛。^_^

按照 zhouhuahai(道号"虚无") 的说法,用一个循环来生成四个数,我觉得在这种情况还是直接给定四个数比较直观易懂吧。我觉得让程序易读易懂是比较重要的。
goodluckyxl 2005-09-08
  • 打赏
  • 举报
回复
先设置小端对齐
赋值int a = 0x 1234;
然后设置大端对齐
给变量赋 int b = a;
再设置回来显示
看看能不能达到效果
xiao_xiao_zi 2005-09-08
  • 打赏
  • 举报
回复
用移位符>>和<<
zhouhuahai 2005-09-08
  • 打赏
  • 举报
回复
用四个数0xf000,0x0f00,0x00f0,0x000f分别与它相与,
可以for( unsigned int i = 0xf000; i>=0; i >>= 4)来弄,不用四个数.
zhouhuahai 2005-09-08
  • 打赏
  • 举报
回复
先用sprintf("%x", ...)方式写入一个字符串,再把这个字符串逆序.再来一个atoi搞定.
doway 2005-09-08
  • 打赏
  • 举报
回复
取整型对象地址,强制转换成 byte*,然后就可以交换了。
megaboy 2005-09-08
  • 打赏
  • 举报
回复
晕死,看错题目了,原来是移动那四个字节啊,重新写。
megaboy 2005-09-08
  • 打赏
  • 举报
回复
#include <stdio.h>

int main()
{
unsigned int iNum=37682, iTemp=0;
while(iNum/10)
{
iTemp += iNum-iNum/10*10;
iTemp *= 10;
iNum /= 10;
}
iTemp += iNum;
printf("%d", iTemp);
return 0;
}

注意数字倒转前后不要超过unsigned int的最大范围,如会超过,就得用更大的整数类型,如long。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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