prob-16-bope.cpp

#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;
}