>>349
ちょと面白そうなので、俺も参加。

int search( /* 返り値 -> 1:見つかった, 0:見つからなかった */
  unsigned char *a, /* 検索の対象のポインタ */
  int l, /* 検索する対象のサイズ(バイト単位) */
  int sp, /* 検索対象のパリティー */
  int sc, /* 検索対象のビット数 */
  int *fp, /* 検索結果の位置(バイト)*/
  int *fb /* 検索結果の位置(ビット) */ )
{
  struct { int l, r, f; } t[ 256 ], *b;
  int i, j, c[ 8 ], n, d = 0;

  for( i = 0 ; i < 256 ; i ++ ) {
    int p = ( i >> 7 ), q, r, s;

    b = &t[ i ];
    for( c[ n = 0 ] = 0, q = p, j = 8 ; -- j >= 0 ; c[ n ] ++ )
      if( q != ( r = ( ( i >> j ) & 1 ) ) ) {
        c[ ++ n ] = 0;
        q = r;
        }
    n ++;
    b->l = ( ( sp == p ) ? c[ 0 ] : 0 );
    for( b->f = -1, s = 0, q = p, j = 0 ; j < n ; j ++, q = !q ) {
      if( ( sp == q ) && ( sc <= c[ j ] ) )
        b->f = s;
      s += c[ j ];
      }
    b->r = ( ( sp != q ) ? c[ n - 1 ] : 0 );
    }
  for( n = 0 ; n < l ; n ++ ) {
    b = &t[ a[ n ] ];
    if( sc <= b->l + d ) {
      *fp = n - 1 - ( ( d - 1 ) / 8 );
      *fb = 8 - d % 8;
      return 1;
      }
    if( b->f != -1 ) {
      *fp = n;
      *fb = b->f;
      return 1;
      }
    if( b->r != 8 )
      d = 0;
    d += b->r;
    }
  return 0;
  }