static int decodegamma(unsigned short *B,i64 p,i64 *ans) { i64 w,w2; i64 x; w = getzerorun(B,p); #if 0 x = 1; for (i=0;i<w;i++) { x <<= 1; x += getbit(B,1+p+w+1+i); } #else p += w+1; x = 1; w2 = w; while (w2 > DD) { x <<= DD; x += getbitD(B,1+p); p += DD; w2 -= DD; } x <<= w2; x += (getbitD(B,1+p)>>(DD-w2)); #endif *ans = x; return 2*w+1; }
int decodegamma(unsigned short *B,int p,int *ans) { int w,x; int w2; #if 0 x = getbitD(B,1+p); b = R6b[x]; if (b>0) { *ans = R6x[x]; return b; } #endif w = getzerorun(B,p); #if 0 x = 1; for (i=0;i<w;i++) { x <<= 1; x += getbit(B,1+p+w+1+i); } #else /* psigamma_ */ p += w+1; x = 1; w2 = w; while (w2 > DD) { x <<= DD; x += getbitD(B,1+p); p += DD; w2 -= DD; /* w return value */ } x <<= w2; x += (getbitD(B,1+p)>>(DD-w2)); #endif *ans = x; return 2*w+1; }