Chinaunix首页 | 论坛 | 博客
  • 博客访问: 629277
  • 博文数量: 105
  • 博客积分: 5389
  • 博客等级: 准将
  • 技术积分: 1290
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-29 11:13
文章分类

全部博文(105)

文章存档

2010年(23)

2009年(20)

2008年(62)

分类: C/C++

2009-06-24 15:40:23

在mpeg系列(mpeg1,mpeg2,mpeg4)标准之中,系统层和视频层都有类似0x000001xx开头的起始码,解析协议或者解码过程中常常需要寻找类似的起始码。
最直观,最省力,不耗费心思优化的代码如下:
    ...
    int Bfr = 0xCDCDCDCD;
    while((Bfr &0xffffff00) != 0x100) {
        Bfr = (Bfr << 8) | *p++;
    }
    ...
   
每次循环p指正向后移动一个字节单位,复杂度为O(n), n为找到起始码所读取的字节数;
我们来看看快些的方法:
    ...
    while(valid(p)){
        if (p[-1] > 1) p += 3;
        else if (p[-2] ) p += 2;
        else if(p[-3]|(p[-1]-1)) p++;
        else {
            p++;
            break;
        }
    }
    ...
    
显然,这一算法的复杂度在理想条件下,可以降到O(n/3)。
在平时的优化工作中,需着眼小处仔细思考,抓出像这种地方。
阅读(926) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~