BitUtil: delta, zigzag, bitsnum,...

This commit is contained in:
powturbo
2015-06-18 17:35:01 +02:00
parent 5bc03c8507
commit 2f2e6b8fbe

View File

@ -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);