6字节的数组和4字节的数据比较

[复制链接]
2870|10
 楼主| jerkoh 发表于 2010-1-28 22:02 | 显示全部楼层 |阅读模式
本帖最后由 jerkoh 于 2010-1-28 22:06 编辑

一个应用 如下
unsigned char buf1[6];
unsigned char buf2[4];

如当buf1[6]={0x00,0x00,0x77,0x88,0x99,0xaa};
     buf2[4]={0x77,0x88,0x99,0xaa};

如何快速的比较 buf1[5] buf1[4]  buf1[3] buf1[2]  组合的ULONG                 buf1[1] buf1[0] 的值不计算在内

和buf2[3] buf2[2] buf2[1] buf2[0] 组合的ULONG 是否相等
 楼主| jerkoh 发表于 2010-1-28 22:22 | 显示全部楼层
本帖最后由 jerkoh 于 2010-1-28 22:55 编辑

#include <string.h>
unsigned char buf1[6]={0x00,0x00,0x77,0x88,0x99,0xaa};
unsigned char buf2[4]={0x77,0x88,0x99,0xaa};
void main()
{
   while(1)
   {
     /*
         if(memcmp(buf1+2,buf2,sizeof(buf2))==0)
         {
           for(;;);              //12Mhz A time 0.00009  //库函数 最慢
         }
         else
         {
           for(;;);
         }
         */
         if((buf1[5]==buf2[3])&&\
                 (buf1[4]==buf2[2])&&\
                  (buf1[3]==buf2[1])&&\
                   (buf1[2]==buf2[0]))
         {
           for(;;);     //B 12Mhz  time 0.000012  最笨方法 最快

         }
         else
         {
           for(;;);
         }


   }

#include <string.h>
unsigned char buf1[6]={0x00,0x00,0x77,0x88,0x99,0xaa};
//unsigned char buf2[4]={0x77,0x88,0x99,0xaa};
union
{
  unsigned char buf2[4];
  unsigned long ul_buf;
}ul2char;
typedef struct
{
  unsigned char STH;
  unsigned char STL;
  unsigned long ul_data;
}ULdata;
void main()
{
   ULdata xdata *ptr;
   while(1)
   {
  ul2char.ul_buf=0x778899aal;
  ptr=(ULdata xdata *)(buf1);
  if(ul2char.ul_buf==ptr->ul_data)
  {
    for(;;);   //C 12mhz 0.000064           //xdata 改idata 0.000053 复杂操作  速度中等
  }
}

除了上面方法 有没其他 ?时间用的更少的 来PK下
again_gyf 发表于 2010-1-29 09:13 | 显示全部楼层
结构体那个是错的,你要强制对齐
again_gyf 发表于 2010-1-29 09:18 | 显示全部楼层
逐个比较不是最快的,如果4个字节都相等就需要比四次
again_gyf 发表于 2010-1-29 09:19 | 显示全部楼层
快慢还要取决于你的平台,看你是8位机,还是逐个比较吧
again_gyf 发表于 2010-1-29 09:21 | 显示全部楼层
也最保险,指针和结构体都有可能出错的,因为要对齐,偶地址。。。
 楼主| jerkoh 发表于 2010-1-29 11:13 | 显示全部楼层
8bit mcu
xinzha 发表于 2010-1-29 13:30 | 显示全部楼层
八位机是不是可以用如下这种方法(小端表达式),
ULONG* a = (ULONG*)(buf1 + 2);
ULONG* b = (ULONG*)buf2;
if(*a = *b)
{
    /* */
}
else
{
     /* */
}
lanmp 发表于 2010-1-29 13:49 | 显示全部楼层
你这只是把工作交给了编译器,该做的还是要做,而且未必比你自己做简单。
xinzha 发表于 2010-1-29 13:58 | 显示全部楼层
呃,那如果是比较汇编级别的话,8bit的cpu只能一个个比了吧,发现一个不等就退出循环,省得浪费cpu时间。
因特网用户 发表于 2010-1-29 17:50 | 显示全部楼层
想起了之前的一个讨论 在C语言中如何实现结构体的整体拷贝
讨论来讨论去 没什么好办法 memcpy
8bit MCU 最终还是要一个一个的比较的
你凋用库函数之所以慢 主要是要赋值 并且使用了指针
还是一个一个的比较实在
您需要登录后才可以回帖 登录 | 注册

本版积分规则

116

主题

1409

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部