打印

小问题:字节颠倒用什么方法最好?

[复制链接]
楼主: alphal
手机看帖
扫描二维码
随时随地手机跟帖
21
平常人| | 2008-2-2 09:31 | 只看该作者 回帖奖励 |倒序浏览

Cortex-M3中确实有这样的指令,估计C编译用不到这条指令

这条指令是:RBIT.W <Rd>, <Rm>,C编译用不到这条指令,不是因为C编译做得不好,是因为C语言没办法描述这样的操作,除非用内嵌汇编的方式。

---------------------------
另外,没想到我8楼的小窍门还挺受欢迎,谢谢各位大虾捧场;只可惜匠人被大雪困住了,否则的话,没准还能赚条21IC有史以来最短的裤头,哇哈哈哈。。。。

使用特权

评论回复
22
古道热肠| | 2008-2-2 12:05 | 只看该作者

哈哈,早就有人送裤子给平常人了

自己还不知道,解决问题的方法很巧妙,真是~~ 一语道破天机呀 ~~

使用特权

评论回复
23
ifree64| | 2008-2-13 20:11 | 只看该作者

这个方法也不是很简答啊!

8楼的方法:

y = table[x&0x0f]<<4 | table[x>>4];

能够用C实现得更简单吗?

使用特权

评论回复
24
ayb_ice| | 2008-2-14 09:52 | 只看该作者

移位或查表或直接用位判断操作(适合有位操作的MCU)

使用特权

评论回复
25
d5man| | 2008-2-14 10:59 | 只看该作者

求字节颠倒的半字节查表法的详细论文

以便更多人分享

使用特权

评论回复
26
疯子8972| | 2008-2-14 11:24 | 只看该作者

想起以前了,汗!!!

我有次把电路版画错了,就只能用查表把8位全部倒过来......
还有,那个表格也不小,自己打字累,用vc写了个小东西,输出在文件里
ctrl+c ctrl+v在程序里就好了
现在单片机FLASH都大,256字节不算什么,16字节也就少了一点点,应该不差那么一点:)

使用特权

评论回复
27
wuxi_stl| | 2008-2-14 12:49 | 只看该作者

学习学习

使用特权

评论回复
28
change_p| | 2008-2-15 10:29 | 只看该作者

查表法与移位法程序

查表法:
INT8U ReversalTbl[] = {0x00, 0x08, 0x04, 0x0c, 0x02, 0x0a, 0x06, 0x0e, 0x01, 0x09, 0x05, 0x0d, 0x03, 0x0b, 0x07, 0x0f};

INT8U ReversalFun(INT8U input)
{
    INT8U output;
    INT8U byte_h = Reversal[input / 16];  //高8位查表
    INT8U byte_l = Reversal[input % 16];  // 低8位查表
    output = byte_l * 16 + byte_h;    //交叉代替
    return output;
}

移位法:(C51)
INT8U bdata InData;    
sbit Bit_L = InData^0;
INT8U ReversalFun(INT8U input)
{
    INT8U i;
    INT8U output = 0;
    InData = input;
    for (i=0; i<8; i++){  
        output = output << 1;    //输出数据初始为0,左移1位仍为0
        output += (INT8U)Bit_L;  
        InData = InData >> 1;
    }
    return output;
}





使用特权

评论回复
29
ifree64| | 2008-2-15 13:54 | 只看该作者

用硬件实现

突然想到一个办法,如果是单片机的话,可不可以在IO资源充分的情况下这样实现:

PORTA = x;
y = PINB;

外围用线路把PA口和PB口颠倒过来接。

使用特权

评论回复
30
ayb_ice| | 2008-2-15 14:47 | 只看该作者

30楼的方法不错

不过还是不如直接查表

使用特权

评论回复
31
fsaok| | 2008-2-16 08:07 | 只看该作者

如果一定要用C

void reser(char InData)
{
  char i;
  char OutData = 0;

  for (i=0;i < 8; i++)
  {
    if ((InData & (1<<i) == 1)
      OutData |= 0x80 >> (7-i);
  }
}

使用特权

评论回复
32
沉思的鱼| | 2008-2-16 08:31 | 只看该作者

查表

还是查表的效率比较高

使用特权

评论回复
33
ayb_ice| | 2008-2-16 08:34 | 只看该作者

随便说说

32L的
if ((InData & (1<<i) == 1)
      OutData |= 0x80 >> (7-i);
}
效率很低,下面的会快很多
unsigned char byte_reverse(unsigned char x)
{
    unsigned char i,y;

    for(i=8; i; i--){
        y <<= 1;
        if(x & 0x01){
            y++;
        }
        x >>= 1;
    }
    return y;
}

使用特权

评论回复
34
wuxi_stl| | 2008-2-16 10:03 | 只看该作者

34L:这样是不是更快些

unsigned char byte_reverse(unsigned char byte)
{
    unsigned char mask = 1, result;

    while(mask)
    {     
        if(byte & 0x80)
            result != mask;
        byte <<= 1;
        mask <<= 1;
    }
    return result;
}
当然,无论如何改,都没有高低4位分别查表再对调 方法快!

使用特权

评论回复
35
change_p| | 2008-2-16 10:39 | 只看该作者

35楼好办法,修改几处笔误,^_^



unsigned char byte_reverse(unsigned char byte)
{
    unsigned char mask = 1;
    unsigned char result = 0; //将result初始为0

    while(mask)
    {     
        if(byte & 0x80)
            result != mask;  //应是result |= mask;
        byte <<= 1;
        mask <<= 1;
    }
    return result;
}

使用特权

评论回复
36
古道热肠| | 2008-2-16 13:03 | 只看该作者

30楼的方法有新意

不占用软件资源,占用硬件资源,符合嵌入式系统设计中“以硬代软,以软代硬”灵活变通的原则

使用特权

评论回复
37
gyt| | 2008-2-16 13:08 | 只看该作者

30楼确实很聪明

使用特权

评论回复
38
wuzhenzhi| | 2008-2-16 20:37 | 只看该作者

代码如下

还有一种算法,虽然很巧,不过不一定快:简述如下
abcdefgh 相邻两个交换->
badcfehg 2 2交换->
dcbahgfe 4 4交换->
hgfedcba

使用特权

评论回复
39
zenyin| | 2008-2-16 20:44 | 只看该作者

把读入口线倒过个怎么样?

如果数据是从外部读入的!移位是最简单的,但最费时

使用特权

评论回复
40
ifree64| | 2008-2-16 21:59 | 只看该作者

39L的方法问题在于如何实现你的几个交换?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则