Changeset: c612ab18ba87 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c612ab18ba87
Modified Files:
        gdk/gdk_bitvector.c
Branch: mosaic
Log Message:

Fix bit-stuffing


diffs (101 lines):

diff --git a/gdk/gdk_bitvector.c b/gdk/gdk_bitvector.c
--- a/gdk/gdk_bitvector.c
+++ b/gdk/gdk_bitvector.c
@@ -44,18 +44,19 @@ void
 setBitVector(BitVector vector, const BUN i, const int bits, const int value)
 {
        BUN cid;
-       unsigned int m1,  m2;
+       unsigned int m1,  m2, shift;
 
-    //printf("#setBitVector %ld i "BUNFMT" bits %d value 
%d\n",(long)vector,i,bits, value);
        cid = (i * bits) / BITS;
-       m1  = ((i * bits) % BITS)/bits;
-    if ( m1 * bits <= BITS)
-        vector[cid]= (vector[cid]  & ~( masks[bits] << (m1 * bits))) | ((value 
& masks[bits]) << (m1 * bits));
-    else{ 
-               m1 = (m1 * bits) % BITS;
+       shift  = (i * bits) % BITS;
+    if ( (shift + bits) <= BITS){
+        vector[cid]= (vector[cid]  & ~( masks[bits] << shift)) | ((value & 
masks[bits]) << (shift));
+               //printf("#setBitVector i "BUNFMT" bits %d value %d shift %d 
vector[cid]=%o\n",i,bits,value,shift, vector[cid]);
+    }else{ 
+               m1 = BITS - shift;
                m2 = bits - m1;
-        vector[cid]= (vector[cid]  & ~( masks[bits] << (m1 * bits))) | ( 
(value & masks[bits]) << (BITS-m1));
-        vector[cid+1]= 0 | ( (value & masks[bits])  >> m2);
+        vector[cid]= (vector[cid]  & ~( masks[m1] << shift)) | ( (value & 
masks[m1]) << shift);
+        vector[cid+1]= 0 |  ((value >> m1) & masks[m2]) ;
+               //printf("#setBitVector i "BUNFMT" bits %d value %d shift=%d 
m1=%d m2=%d vector[cid]=%o vector[cid+1]=%o\n",i,bits,value,shift,m1,m2, 
vector[cid],vector[cid+1]);
        }
 }
 
@@ -71,18 +72,19 @@ int
 getBitVector(BitVector vector, BUN i, int bits)
 {
        BUN cid;
-       unsigned int value = 0, m1,m2;
+       unsigned int value = 0, m1,m2= 0, shift;
        
        cid = (i * bits) / BITS;
-       m1  = ((i * bits) % BITS)/bits;
-       if ( m1 * bits <= BITS)
-               value = (vector[cid] >> (m1 * bits)) & masks[bits];
-       else{ 
-               m1 = (m1 * bits) % BITS;
+       shift  = (i * bits) % BITS;
+       if ( (shift + bits) <= BITS){
+               value = (vector[cid] >> shift) & masks[bits];
+               //printf("#getBitVector i "BUNFMT" bits %d value %d shift %d 
vector[cid]=%o\n",i,bits,value,shift, vector[cid]);
+       } else{ 
+               m1 = BITS-shift;
                m2 = bits - m1;
-               value  = (((vector[cid] >> (BITS - m1)) & masks[bits - m1]) << 
m2) | (vector[cid+1] & masks[m2]);
+               value = ((vector[cid] >> shift) & masks[m1]) | ((vector[cid+1] 
& masks[m2])<< m1);
+               //printf("#getBitVector i "BUNFMT" bits %d value %d m1=%d m2=%d 
vector[cid]=%o vector[cid+1]=%o\n",i,bits,value,m1,m2, 
vector[cid],vector[cid+1]);
          }
-    //printf("#getBitVector %ld i "BUNFMT" bits %d value 
%d\n",(long)vector,i,bits,value);
        return value;
 }
 
@@ -92,40 +94,3 @@ tstBitVector(BitVector m, BUN idx, int w
        return getBitVector(m,idx,width) > 0;
 }
 
-
-/* Unit testing
-static void
-printVector(BitVector v, BUN cnt, int width)
-{
-       int i;
-       for ( i = 0; i< cnt; i++)
-               printf("[%d] %d\n",i, getBitVector(v,i,width));
-}
-
-int main(int argc, char **argv)
-{
-       int cnt, width,i,j,k;
-       BitVector vector;
-
-       if( argc != 3){
-               printf("use:%s <cnt> <width>\n",argv[0]);
-               exit(-1);
-       }
-       cnt = atoi(argv[1]);
-       width= atoi(argv[2]);
-       printf("testing bitvectors %d %d %d\n",cnt,width, BITS);
-       initBitMasks();
-       vector = newBitVector(cnt,width);
-
-       printVector(vector,cnt,width);
-       for(i = 0; i< cnt; i++)
-               setBitVector(vector,i,width, i);
-       printVector(vector,cnt,width);
-       for(i = 0; i < cnt; i++){
-               j = rand() % width;
-               setBitVector(vector,i,width, j );
-               if( j != (k = getBitVector(vector,i,width)) )
-                       printf("mismatch[%d] %d %d\n",i,j,k);
-       }
-}
-*/
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to