From 2f2e6b8fbec6c00f646a0db18bc0be37b72303d4 Mon Sep 17 00:00:00 2001 From: powturbo Date: Thu, 18 Jun 2015 17:35:01 +0200 Subject: [PATCH] BitUtil: delta, zigzag, bitsnum,... --- bitutil.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/bitutil.c b/bitutil.c index 1880014..6004c5f 100644 --- a/bitutil.c +++ b/bitutil.c @@ -48,6 +48,20 @@ 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) { #ifdef __SSE2__ unsigned *ip,b,*op = out; @@ -78,6 +92,16 @@ unsigned bit32(unsigned *in, unsigned n) { 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) { #ifdef __SSE2__ unsigned *ip,b; __m128i bv = _mm_setzero_si128(), sv = _mm_set1_epi32(start);