#include <stdio.h>
#include <assert.h>
unsigned char bitseq[50] = { 0 };
int store(unsigned a) {
unsigned b, lo, hi, bitpos, byteno, cur;
assert(a
< 4032); // a has range 0 .. 0xfbf
// shuffle
b = (a << 9) + (a << 6) + a + 64; // range 0x40 ..0x237dbf
b = (b & 0xfff) + ((b & 0xfff000) >> 6); // range 0x40 .. 0x9d7f
b = (b & 0xfff) + ((b & 0xfff000) >> 6); // range 0x40 .. 0x11ff
b = (b & 0xfff) + ((b & 0xfff000) >> 6); // range 0x40 .. 0xfff
assert(b
>= 0x40 && b
<= 0xfff); b -= 64; // range 0x00 .. 0xfbf
// split
lo = b & 63; // range 0x00 .. 0x3f
hi = b >> 6; // range 0x00 .. 0x3e
// access bit sequence
bitpos = (lo << 2) + (lo << 1); // range 0x00 .. 0x17a
byteno = (bitpos >> 3); // range 0x00 .. 0x30
bitpos &= 7; // range 0x00 .. 0x7
cur = (((bitseq[byteno + 1] << 8) | bitseq[byteno]) >> bitpos) & 0xff;
if (cur != 0) return 1; // slot already occupied.
cur = hi + 1; // range 0x01 .. 0x3f means occupied
assert(cur
>= 0x01 && cur
<= 0x3f); bitseq[byteno] |= (cur << bitpos) & 0xff;
bitseq[byteno + 1] |= ((cur << bitpos) & 0xff00) >> 8;
/*
printf("Storing %02x (now %02x) in %02x and %02x (now %02x) in %02x for %02x shift %d shifted %04x\n",
(cur << bitpos) & 0xff, bitseq[byteno], byteno,
((cur << bitpos) & 0xff00) >> 8, bitseq[byteno + 1], byteno + 1,
cur, bitpos, cur << bitpos);
*/
return 0; // slot was free, value stored
}
void list_all() {
unsigned b, lo, hi, bitpos, byteno, cur;
for (lo = 0; lo != 64; ++lo) {
// access bit sequence
bitpos = (lo << 2) + (lo << 1);
byteno = (bitpos >> 3);
bitpos &= 7;
cur = (((bitseq[byteno + 1] << 8) | bitseq[byteno]) >> bitpos) & 0x3f;
if (cur == 0) continue;
/*
printf("read %02x (now %02x) from %02x and %02x (now %02x) from %02x for %02x shift %d shifted %04x\n",
(cur << bitpos) & 0xff, bitseq[byteno], byteno,
((cur << bitpos) & 0xff00) >> 8, bitseq[byteno + 1], byteno + 1,
cur, bitpos, cur << bitpos);
*/
// recombine
hi = cur - 1;
b = (hi << 6) | lo;
// unshuffle
b = (b << 10) + (b << 7) + b + 64;
b = (b & 0xfff) + ((b & 0xfff000) >> 6);
b = (b & 0xfff) + ((b & 0xfff000) >> 6);
b = (b & 0xfff) + ((b & 0xfff000) >> 6);
assert(b
>= 0x40 && b
<= 0xfff); b -= 64;
// report
printf("%4d was stored in slot %2d using value %2d.\n", b
, lo
, cur
); }
}
int main() {
int res;
res
= store
(123); assert(res
== 0); res
= store
(452); assert(res
== 0); res
= store
(68); assert(res
== 1); // will collide with 452 list_all();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KCnVuc2lnbmVkIGNoYXIgYml0c2VxWzUwXSA9IHsgMCB9OwoKaW50IHN0b3JlKHVuc2lnbmVkIGEpIHsKICB1bnNpZ25lZCBiLCBsbywgaGksIGJpdHBvcywgYnl0ZW5vLCBjdXI7CiAgYXNzZXJ0KGEgPCA0MDMyKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGhhcyByYW5nZSAwIC4uIDB4ZmJmCgogIC8vIHNodWZmbGUKICBiID0gKGEgPDwgOSkgKyAoYSA8PCA2KSArIGEgKyA2NDsgICAgICAgIC8vIHJhbmdlIDB4NDAgLi4weDIzN2RiZgogIGIgPSAoYiAmIDB4ZmZmKSArICgoYiAmIDB4ZmZmMDAwKSA+PiA2KTsgLy8gcmFuZ2UgMHg0MCAuLiAweDlkN2YKICBiID0gKGIgJiAweGZmZikgKyAoKGIgJiAweGZmZjAwMCkgPj4gNik7IC8vIHJhbmdlIDB4NDAgLi4gMHgxMWZmCiAgYiA9IChiICYgMHhmZmYpICsgKChiICYgMHhmZmYwMDApID4+IDYpOyAvLyByYW5nZSAweDQwIC4uIDB4ZmZmCiAgYXNzZXJ0KGIgPj0gMHg0MCAmJiBiIDw9IDB4ZmZmKTsKICBiIC09IDY0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhbmdlIDB4MDAgLi4gMHhmYmYKCiAgLy8gc3BsaXQKICBsbyA9IGIgJiA2MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhbmdlIDB4MDAgLi4gMHgzZgogIGhpID0gYiA+PiA2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFuZ2UgMHgwMCAuLiAweDNlCgogIC8vIGFjY2VzcyBiaXQgc2VxdWVuY2UKICBiaXRwb3MgPSAobG8gPDwgMikgKyAobG8gPDwgMSk7ICAgICAgICAgIC8vIHJhbmdlIDB4MDAgLi4gMHgxN2EKICBieXRlbm8gPSAoYml0cG9zID4+IDMpOyAgICAgICAgICAgICAgICAgIC8vIHJhbmdlIDB4MDAgLi4gMHgzMAogIGJpdHBvcyAmPSA3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFuZ2UgMHgwMCAuLiAweDcKICBjdXIgPSAoKChiaXRzZXFbYnl0ZW5vICsgMV0gPDwgOCkgfCBiaXRzZXFbYnl0ZW5vXSkgPj4gYml0cG9zKSAmIDB4ZmY7CiAgaWYgKGN1ciAhPSAwKSByZXR1cm4gMTsgLy8gc2xvdCBhbHJlYWR5IG9jY3VwaWVkLgogIGN1ciA9IGhpICsgMTsgICAgICAgICAgIC8vIHJhbmdlIDB4MDEgLi4gMHgzZiBtZWFucyBvY2N1cGllZAogIGFzc2VydChjdXIgPj0gMHgwMSAmJiBjdXIgPD0gMHgzZik7CiAgYml0c2VxW2J5dGVub10gfD0gKGN1ciA8PCBiaXRwb3MpICYgMHhmZjsKICBiaXRzZXFbYnl0ZW5vICsgMV0gfD0gKChjdXIgPDwgYml0cG9zKSAmIDB4ZmYwMCkgPj4gODsKICAvKgogIHByaW50ZigiU3RvcmluZyAlMDJ4IChub3cgJTAyeCkgaW4gJTAyeCBhbmQgJTAyeCAobm93ICUwMngpIGluICUwMnggZm9yICUwMnggc2hpZnQgJWQgc2hpZnRlZCAlMDR4XG4iLAogICAgICAgICAoY3VyIDw8IGJpdHBvcykgJiAweGZmLCBiaXRzZXFbYnl0ZW5vXSwgYnl0ZW5vLAogICAgICAgICAoKGN1ciA8PCBiaXRwb3MpICYgMHhmZjAwKSA+PiA4LCBiaXRzZXFbYnl0ZW5vICsgMV0sIGJ5dGVubyArIDEsCiAgICAgICAgIGN1ciwgYml0cG9zLCBjdXIgPDwgYml0cG9zKTsKICAqLwogIHJldHVybiAwOyAgICAgICAgICAgICAgIC8vIHNsb3Qgd2FzIGZyZWUsIHZhbHVlIHN0b3JlZAp9Cgp2b2lkIGxpc3RfYWxsKCkgewogIHVuc2lnbmVkIGIsIGxvLCBoaSwgYml0cG9zLCBieXRlbm8sIGN1cjsKICBmb3IgKGxvID0gMDsgbG8gIT0gNjQ7ICsrbG8pIHsKICAgIC8vIGFjY2VzcyBiaXQgc2VxdWVuY2UKICAgIGJpdHBvcyA9IChsbyA8PCAyKSArIChsbyA8PCAxKTsKICAgIGJ5dGVubyA9IChiaXRwb3MgPj4gMyk7CiAgICBiaXRwb3MgJj0gNzsKICAgIGN1ciA9ICgoKGJpdHNlcVtieXRlbm8gKyAxXSA8PCA4KSB8IGJpdHNlcVtieXRlbm9dKSA+PiBiaXRwb3MpICYgMHgzZjsKICAgIGlmIChjdXIgPT0gMCkgY29udGludWU7CgogICAgLyoKICAgIHByaW50ZigicmVhZCAlMDJ4IChub3cgJTAyeCkgZnJvbSAlMDJ4IGFuZCAlMDJ4IChub3cgJTAyeCkgZnJvbSAlMDJ4IGZvciAlMDJ4IHNoaWZ0ICVkIHNoaWZ0ZWQgJTA0eFxuIiwKICAgICAgICAgKGN1ciA8PCBiaXRwb3MpICYgMHhmZiwgYml0c2VxW2J5dGVub10sIGJ5dGVubywKICAgICAgICAgKChjdXIgPDwgYml0cG9zKSAmIDB4ZmYwMCkgPj4gOCwgYml0c2VxW2J5dGVubyArIDFdLCBieXRlbm8gKyAxLAogICAgICAgICBjdXIsIGJpdHBvcywgY3VyIDw8IGJpdHBvcyk7CiAgICAqLwoKICAgIC8vIHJlY29tYmluZQogICAgaGkgPSBjdXIgLSAxOwogICAgYiA9IChoaSA8PCA2KSB8IGxvOwoKICAgIC8vIHVuc2h1ZmZsZQogICAgYiA9IChiIDw8IDEwKSArIChiIDw8IDcpICsgYiArIDY0OwogICAgYiA9IChiICYgMHhmZmYpICsgKChiICYgMHhmZmYwMDApID4+IDYpOwogICAgYiA9IChiICYgMHhmZmYpICsgKChiICYgMHhmZmYwMDApID4+IDYpOwogICAgYiA9IChiICYgMHhmZmYpICsgKChiICYgMHhmZmYwMDApID4+IDYpOwogICAgYXNzZXJ0KGIgPj0gMHg0MCAmJiBiIDw9IDB4ZmZmKTsKICAgIGIgLT0gNjQ7CgogICAgLy8gcmVwb3J0CiAgICBwcmludGYoIiU0ZCB3YXMgc3RvcmVkIGluIHNsb3QgJTJkIHVzaW5nIHZhbHVlICUyZC5cbiIsIGIsIGxvLCBjdXIpOwogIH0KfQoKaW50IG1haW4oKSB7CiAgaW50IHJlczsKICByZXMgPSBzdG9yZSgxMjMpOyBhc3NlcnQocmVzID09IDApOwogIHJlcyA9IHN0b3JlKDQ1Mik7IGFzc2VydChyZXMgPT0gMCk7CiAgcmVzID0gc3RvcmUoNjgpOyBhc3NlcnQocmVzID09IDEpOyAvLyB3aWxsIGNvbGxpZGUgd2l0aCA0NTIKICBsaXN0X2FsbCgpOwogIHJldHVybiAwOwp9Cg==