/*******************************************************
bope.c
v. 1.0 10/jul/93
14/jul/93 .. rewriten completely
xpand,rtract,gtrans,traa,
fgoss,ngoss,lgoss,pgoss,
mapss,ffss,w,
inner,gray,antigray,
*/
#include
#include
void xpand(int subbase) /* expand to subspace */
{
int g;
g= fgoss(subbase); /* get first generator */
while (g) /* while there is unused generator */
{
tx(g); /* expand along generator */
g= ngoss(g,subbase); /* get next generator */
}
}
void rtract(int subbase) /* retract from subspace */
{
int g;
g= fgoss(subbase); /* get first g */
while(g) { /* while there are gens in subspace */
if (currentpoint & g) t(g); /* if bit pointed by g is 1 then transfer */
else o(); /* else quit */
g= ngoss(g,subbase); /* get next g */
}
}
void gtrans(int subbase) /* Gray transfer in subspace */
{
int ff,p;
ff= ffss(subbase); /* create normalized subbase */
p= mapss(subbase,ff,currentpoint); /* map currenpoint to ff */
p= antigray(p); /* find antigray */
p= (p+1) & ff; /* add arithmeticaly */
p= gray(p); /* back to gray */
p= mapss(ff,subbase,p); /* map back */
p= (currentpoint & (~subbase)) | p; /* make point where to transfer */
t(currentpoint ^ p); /* transfer */
}
void traa(int subbase, int r) /* transfer arithmeticaly in subspace */
{
int ff;
int p;
ff= ffss(subbase); /* create normalized subbase */
p= mapss(subbase,ff,currentpoint); /* map currentpoint to ff */
p= p+ r; /* add arithmeticaly */
p= mapss(ff,subbase,p); /* map back */
p= (currentpoint & (~subbase)) | p; /* make point where to transfer */
t(currentpoint ^ p); /* transfer */
}
int mapss(int subbase1, int subbase2, int p1)
{
int g1,g2; /* maps p1 from subbase1 to subbase2 */
int p2; /* e.g. if subbase1 ==00001111 */
/* subbase2 == 0001111000 */
g1= fgoss(subbase1); /* and p1 == xxxxxabcd */
g2= fgoss(subbase2); /* then p2 will be 000abcd000 */
p2= 0;
while(g1 && g2)
{
if (p1 & g1) p2= p2 ^ g2;
g1= ngoss(g1,subbase1);
g2= ngoss(g2,subbase2);
}
return p2;
}
int inner(int v1, int v2) /* inner product */
{ /* of two vectors */
int i,j,m;
i= v1 & v2;
j= 0;
m= MAXSPACE;
while (i)
{
i= i-m;
if (i < 0) i= i+m;
else j= 1-j;
m= m/2;
}
return j;
}
int fgoss(int subbase) /* first generator of subbase */
{
int g;
g= 1;
while (g < MAXSPACE)
{
if (g & subbase) return g;
g= g << 1; } return 0; } int lgoss(int subbase) /* last generator of subbase */ { int g; g= MAXSPACE; while (g) { if (g & subbase) return g; g= g >> 1;
}
return 0;
}
int ngoss(int g, int subbase) /* next generator of subbase */
{
g= g << 1;
while (g < MAXSPACE)
{
if (g & subbase) return g;
g= g << 1; } return 0; } int pgoss(int g, int subbase) /* previous generator of subbase */ { g= g >> 1;
while (g)
{
if (g & subbase) return g;
g= g >> 1;
}
return 0;
}
int ffss(int subbase) /* normalize subbase */
{ /* creates 00111..111 with the same */
/* number of 1’s as subbase */
int k;
int h;
for (k= 1, h= fgoss(subbase); h; k= k<< 1, h=ngoss(h,subbase)); return k-1; } int w(int vector) /* get weight of vector */ { /* the number of binary 1’s */ int k; int h; for (k= 0, h= fgoss(vector); h; k= k+ 1, h=ngoss(h,vector)); return k; } int gray(int p) /* returns Gray code of a given */ { /* point (vector) */ return (p ^ (p >> 1));
}
int antigray(int p) /* returns inverse Gray code */
{ /* of a given point (vector) */
int u;
u= p;
while(p) u= u ^ (p= p >> 1);
return u;
}