C言語なら、俺に聞け! <20>
■ このスレッドは過去ログ倉庫に格納されています
0443デフォルトの名無しさん
NGNGちょと面白そうなので、俺も参加。
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;
}
■ このスレッドは過去ログ倉庫に格納されています