#include „prob-16-kern.h”
#include „prob-16-bope.h”
extern int currentpoint;
__declspec(naked) void xpand(int subbase) /* expand to subspace */
{
__asm
{
push ebp
mov ebp, esp
sub esp, 4
}
int g;
g = 1; // first g in subbase
while (g & subbase) // while there are unsed g in subbase
{
tx(g);// expand
g = g << 1; // next g in subbase
}
__asm
{
mov esp, ebp
pop ebp
ret
}
}
int _cdecl gray(int v) // returns Gray code
{
return (v ^ (v >> 1));
}
int _cdecl antigray(int p) // returns inverse Gray code
{
unsigned u;
u = p;
while (p) u = u ^ (p = p >> 1);
return u;
}
int _cdecl gtrans(int subbase)
{
int ff, p;
ff = ffss(subbase);
p = mapss(subbase, ff, currentpoint);
p = antigray(p);
p = (p + 1) & ff;
p = gray(p);
p = mapss(ff, subbase, p);
p = (currentpoint & (~subbase)) | p;
return currentpoint ^ p;
}
int _cdecl inner(int v1, int v2) // inner product
{
int i, j, m;
i = v1 & v2;
j = 0;
m = SPACESIZE; // spacesize
while (i)
{
i = i – m;
if (i < 0) i = i + m;
else j = 1 – j;
m = m / 2;
}
return j;
}
int _cdecl ngoss(int g, int subbase)
{
g = g << 1;
while (g < SPACESIZE)
{
if (g & subbase) return g;
g = g << 1;
}
return 0;
}
int _cdecl fgoss(int subbase)
{
int g;
g = 1;
while (g < SPACESIZE)
{
if (g & subbase) return g;
g = g << 1;
}
return 0;
}
int _cdecl ffss(int subbase)
{
int k, h;
for (k = 1, h = fgoss(subbase); h; k = k << 1, h = ngoss(h, subbase));
return k – 1;
}
int _cdecl mapss(int subbase1, int subbase2, int p1)
{
int g1, g2;
int p2;
g1 = fgoss(subbase1);
g2 = fgoss(subbase2);
p2 = 0;
while (g1 && g2)
{
if (p1 & g1) p2 = p2 ^ g2;
g1 = ngoss(g1, subbase1);
g2 = ngoss(g2, subbase2);
}
return p2;
}