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