BitUtil: delta, zigzag, bitsnum,...
This commit is contained in:
24
bitutil.c
24
bitutil.c
@ -48,6 +48,20 @@
|
|||||||
while(_p < __p+__n) { *_p = (__start += (*_p) + __inc); _p++; }\
|
while(_p < __p+__n) { *_p = (__start += (*_p) + __inc); _p++; }\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define BITMINMAX(__p,__n, __mi, __mx) {\
|
||||||
|
typeof(__p[0]) _x, *_p;\
|
||||||
|
for(_p = __p, __mi = __mx = 0; _p != __p+(__n&~(4-1)); ) {\
|
||||||
|
if(*_p < __mi) __mi = *_p; if(*_p > __mx) __mx = *_p; _p++; \
|
||||||
|
if(*_p < __mi) __mi = *_p; if(*_p > __mx) __mx = *_p; _p++; \
|
||||||
|
if(*_p < __mi) __mi = *_p; if(*_p > __mx) __mx = *_p; _p++; \
|
||||||
|
if(*_p < __mi) __mi = *_p; if(*_p > __mx) __mx = *_p; _p++; \
|
||||||
|
}\
|
||||||
|
while(_p < __p+__n) { \
|
||||||
|
if(*_p < __mi) __mi = *_p; if(*_p > __mx) __mx = *_p; _p++; \
|
||||||
|
}\
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned bitdelta32(unsigned *in, unsigned n, unsigned *out, unsigned start, unsigned inc) {
|
unsigned bitdelta32(unsigned *in, unsigned n, unsigned *out, unsigned start, unsigned inc) {
|
||||||
#ifdef __SSE2__
|
#ifdef __SSE2__
|
||||||
unsigned *ip,b,*op = out;
|
unsigned *ip,b,*op = out;
|
||||||
@ -78,6 +92,16 @@ unsigned bit32(unsigned *in, unsigned n) {
|
|||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned bitf32( unsigned *in, unsigned n, unsigned start) { return n?bsr32(in[n-1] - start ):0; }
|
||||||
|
unsigned bitf132( unsigned *in, unsigned n, unsigned start) { return n?bsr32(in[n-1] - start - n):0; }
|
||||||
|
|
||||||
|
unsigned bitfm32(unsigned *in, unsigned n, unsigned *pmin) {
|
||||||
|
unsigned mi,mx;
|
||||||
|
BITMINMAX(in, n, mi, mx);
|
||||||
|
*pmin = mi;
|
||||||
|
return bsr32(mx - mi);
|
||||||
|
}
|
||||||
|
|
||||||
unsigned bitd32(unsigned *in, unsigned n, unsigned start) {
|
unsigned bitd32(unsigned *in, unsigned n, unsigned start) {
|
||||||
#ifdef __SSE2__
|
#ifdef __SSE2__
|
||||||
unsigned *ip,b; __m128i bv = _mm_setzero_si128(), sv = _mm_set1_epi32(start);
|
unsigned *ip,b; __m128i bv = _mm_setzero_si128(), sv = _mm_set1_epi32(start);
|
||||||
|
Reference in New Issue
Block a user