void ZnSphereCodec::decode()

in lattices/lattice_Zn.cpp [202:223]


void ZnSphereCodec::decode(uint64_t code, float *c) const {
    int i0 = 0, i1 = natom;
    while (i0 + 1 < i1) {
        int imed = (i0 + i1) / 2;
        if (code_segments[imed].c0 <= code) i0 = imed;
        else i1 = imed;
    }
    const CodeSegment &cs = code_segments[i0];
    code -= cs.c0;
    uint64_t signs = code;
    code >>= cs.signbits;
    cs.decode(code, c);

    int nnz = 0;
    for (int i = 0; i < dim; i++) {
        if (c[i] != 0) {
            if (signs & (1UL << nnz))
                c[i] = -c[i];
            nnz ++;
        }
    }
}