Skip to content

Instantly share code, notes, and snippets.

@tcantenot
Last active May 30, 2025 08:50
Show Gist options
  • Save tcantenot/323a181a7ca191b9ff9fb03dfc9f00ba to your computer and use it in GitHub Desktop.
Save tcantenot/323a181a7ca191b9ff9fb03dfc9f00ba to your computer and use it in GitHub Desktop.
Exponentially spaced set
// Based on: https://x.com/ptrschmdtnlsn/status/1840765584398840233
#include <stdint.h>
#include <stdio.h>
#include <string.h>
constexpr uint32_t N = 7;
constexpr uint32_t M = 1u << N;
constexpr uint32_t MaxNumStates = 6;
void fmt_bits(char str[N+1], int32_t x)
{
uint32_t u;
memcpy(&u, &x, sizeof(uint32_t));
for(int i = 0; i < N; ++i)
{
str[i] = u & (1u << i) ? '1' : '0';
}
str[N] = '\0';
}
int main() {
constexpr uint32_t MaxDuration = 1u << (MaxNumStates - 2);
uint32_t durations[M];
for(int32_t i = 0; i < M; ++i)
{
const int32_t m = i & -i;
const int32_t j = 2 * (i & -i);
char str_bits_i[N+1];
fmt_bits(str_bits_i, i);
char str_bits_minus_i[N+1];
fmt_bits(str_bits_minus_i, -i);
char str_bits_m[N+1];
fmt_bits(str_bits_m, m);
printf("%2d: %s | %3d: %s | m: %s | j: %2d\n", i, str_bits_i, -i, str_bits_minus_i, str_bits_m, j);
durations[i] = j < MaxDuration ? j : MaxDuration;
}
for(int32_t i = 0; i < M * 2; ++i)
{
printf("Frame %3d: 0 ", i);
for(int32_t j = 0, n = i <= M-1 ? i : M-1; j <= n; ++j)
{
if(i < (j + durations[j]))
{
printf("%3d ", j);
}
}
printf("\n");
}
return 0;
}
@tcantenot
Copy link
Author

Output:

 1: 1000000 |  -1: 1111111 | m: 1000000 | j:  2
 2: 0100000 |  -2: 0111111 | m: 0100000 | j:  4
 3: 1100000 |  -3: 1011111 | m: 1000000 | j:  2
 4: 0010000 |  -4: 0011111 | m: 0010000 | j:  8
 5: 1010000 |  -5: 1101111 | m: 1000000 | j:  2
 6: 0110000 |  -6: 0101111 | m: 0100000 | j:  4
 7: 1110000 |  -7: 1001111 | m: 1000000 | j:  2
 8: 0001000 |  -8: 0001111 | m: 0001000 | j: 16
 9: 1001000 |  -9: 1110111 | m: 1000000 | j:  2
10: 0101000 | -10: 0110111 | m: 0100000 | j:  4
11: 1101000 | -11: 1010111 | m: 1000000 | j:  2
12: 0011000 | -12: 0010111 | m: 0010000 | j:  8
13: 1011000 | -13: 1100111 | m: 1000000 | j:  2
14: 0111000 | -14: 0100111 | m: 0100000 | j:  4
15: 1111000 | -15: 1000111 | m: 1000000 | j:  2
16: 0000100 | -16: 0000111 | m: 0000100 | j: 32
17: 1000100 | -17: 1111011 | m: 1000000 | j:  2
18: 0100100 | -18: 0111011 | m: 0100000 | j:  4
19: 1100100 | -19: 1011011 | m: 1000000 | j:  2
20: 0010100 | -20: 0011011 | m: 0010000 | j:  8
21: 1010100 | -21: 1101011 | m: 1000000 | j:  2
22: 0110100 | -22: 0101011 | m: 0100000 | j:  4
23: 1110100 | -23: 1001011 | m: 1000000 | j:  2
24: 0001100 | -24: 0001011 | m: 0001000 | j: 16
25: 1001100 | -25: 1110011 | m: 1000000 | j:  2
26: 0101100 | -26: 0110011 | m: 0100000 | j:  4
27: 1101100 | -27: 1010011 | m: 1000000 | j:  2
28: 0011100 | -28: 0010011 | m: 0010000 | j:  8
29: 1011100 | -29: 1100011 | m: 1000000 | j:  2
30: 0111100 | -30: 0100011 | m: 0100000 | j:  4
31: 1111100 | -31: 1000011 | m: 1000000 | j:  2
32: 0000010 | -32: 0000011 | m: 0000010 | j: 64
33: 1000010 | -33: 1111101 | m: 1000000 | j:  2
34: 0100010 | -34: 0111101 | m: 0100000 | j:  4
35: 1100010 | -35: 1011101 | m: 1000000 | j:  2
36: 0010010 | -36: 0011101 | m: 0010000 | j:  8
37: 1010010 | -37: 1101101 | m: 1000000 | j:  2
38: 0110010 | -38: 0101101 | m: 0100000 | j:  4
39: 1110010 | -39: 1001101 | m: 1000000 | j:  2
40: 0001010 | -40: 0001101 | m: 0001000 | j: 16
41: 1001010 | -41: 1110101 | m: 1000000 | j:  2
42: 0101010 | -42: 0110101 | m: 0100000 | j:  4
43: 1101010 | -43: 1010101 | m: 1000000 | j:  2
44: 0011010 | -44: 0010101 | m: 0010000 | j:  8
45: 1011010 | -45: 1100101 | m: 1000000 | j:  2
46: 0111010 | -46: 0100101 | m: 0100000 | j:  4
47: 1111010 | -47: 1000101 | m: 1000000 | j:  2
48: 0000110 | -48: 0000101 | m: 0000100 | j: 32
49: 1000110 | -49: 1111001 | m: 1000000 | j:  2
50: 0100110 | -50: 0111001 | m: 0100000 | j:  4
51: 1100110 | -51: 1011001 | m: 1000000 | j:  2
52: 0010110 | -52: 0011001 | m: 0010000 | j:  8
53: 1010110 | -53: 1101001 | m: 1000000 | j:  2
54: 0110110 | -54: 0101001 | m: 0100000 | j:  4
55: 1110110 | -55: 1001001 | m: 1000000 | j:  2
56: 0001110 | -56: 0001001 | m: 0001000 | j: 16
57: 1001110 | -57: 1110001 | m: 1000000 | j:  2
58: 0101110 | -58: 0110001 | m: 0100000 | j:  4
59: 1101110 | -59: 1010001 | m: 1000000 | j:  2
60: 0011110 | -60: 0010001 | m: 0010000 | j:  8
61: 1011110 | -61: 1100001 | m: 1000000 | j:  2
62: 0111110 | -62: 0100001 | m: 0100000 | j:  4
63: 1111110 | -63: 1000001 | m: 1000000 | j:  2
64: 0000001 | -64: 0000001 | m: 0000001 | j: 128
65: 1000001 | -65: 1111110 | m: 1000000 | j:  2
66: 0100001 | -66: 0111110 | m: 0100000 | j:  4
67: 1100001 | -67: 1011110 | m: 1000000 | j:  2
68: 0010001 | -68: 0011110 | m: 0010000 | j:  8
69: 1010001 | -69: 1101110 | m: 1000000 | j:  2
70: 0110001 | -70: 0101110 | m: 0100000 | j:  4
71: 1110001 | -71: 1001110 | m: 1000000 | j:  2
72: 0001001 | -72: 0001110 | m: 0001000 | j: 16
73: 1001001 | -73: 1110110 | m: 1000000 | j:  2
74: 0101001 | -74: 0110110 | m: 0100000 | j:  4
75: 1101001 | -75: 1010110 | m: 1000000 | j:  2
76: 0011001 | -76: 0010110 | m: 0010000 | j:  8
77: 1011001 | -77: 1100110 | m: 1000000 | j:  2
78: 0111001 | -78: 0100110 | m: 0100000 | j:  4
79: 1111001 | -79: 1000110 | m: 1000000 | j:  2
80: 0000101 | -80: 0000110 | m: 0000100 | j: 32
81: 1000101 | -81: 1111010 | m: 1000000 | j:  2
82: 0100101 | -82: 0111010 | m: 0100000 | j:  4
83: 1100101 | -83: 1011010 | m: 1000000 | j:  2
84: 0010101 | -84: 0011010 | m: 0010000 | j:  8
85: 1010101 | -85: 1101010 | m: 1000000 | j:  2
86: 0110101 | -86: 0101010 | m: 0100000 | j:  4
87: 1110101 | -87: 1001010 | m: 1000000 | j:  2
88: 0001101 | -88: 0001010 | m: 0001000 | j: 16
89: 1001101 | -89: 1110010 | m: 1000000 | j:  2
90: 0101101 | -90: 0110010 | m: 0100000 | j:  4
91: 1101101 | -91: 1010010 | m: 1000000 | j:  2
92: 0011101 | -92: 0010010 | m: 0010000 | j:  8
93: 1011101 | -93: 1100010 | m: 1000000 | j:  2
94: 0111101 | -94: 0100010 | m: 0100000 | j:  4
95: 1111101 | -95: 1000010 | m: 1000000 | j:  2
96: 0000011 | -96: 0000010 | m: 0000010 | j: 64
97: 1000011 | -97: 1111100 | m: 1000000 | j:  2
98: 0100011 | -98: 0111100 | m: 0100000 | j:  4
99: 1100011 | -99: 1011100 | m: 1000000 | j:  2
100: 0010011 | -100: 0011100 | m: 0010000 | j:  8
101: 1010011 | -101: 1101100 | m: 1000000 | j:  2
102: 0110011 | -102: 0101100 | m: 0100000 | j:  4
103: 1110011 | -103: 1001100 | m: 1000000 | j:  2
104: 0001011 | -104: 0001100 | m: 0001000 | j: 16
105: 1001011 | -105: 1110100 | m: 1000000 | j:  2
106: 0101011 | -106: 0110100 | m: 0100000 | j:  4
107: 1101011 | -107: 1010100 | m: 1000000 | j:  2
108: 0011011 | -108: 0010100 | m: 0010000 | j:  8
109: 1011011 | -109: 1100100 | m: 1000000 | j:  2
110: 0111011 | -110: 0100100 | m: 0100000 | j:  4
111: 1111011 | -111: 1000100 | m: 1000000 | j:  2
112: 0000111 | -112: 0000100 | m: 0000100 | j: 32
113: 1000111 | -113: 1111000 | m: 1000000 | j:  2
114: 0100111 | -114: 0111000 | m: 0100000 | j:  4
115: 1100111 | -115: 1011000 | m: 1000000 | j:  2
116: 0010111 | -116: 0011000 | m: 0010000 | j:  8
117: 1010111 | -117: 1101000 | m: 1000000 | j:  2
118: 0110111 | -118: 0101000 | m: 0100000 | j:  4
119: 1110111 | -119: 1001000 | m: 1000000 | j:  2
120: 0001111 | -120: 0001000 | m: 0001000 | j: 16
121: 1001111 | -121: 1110000 | m: 1000000 | j:  2
122: 0101111 | -122: 0110000 | m: 0100000 | j:  4
123: 1101111 | -123: 1010000 | m: 1000000 | j:  2
124: 0011111 | -124: 0010000 | m: 0010000 | j:  8
125: 1011111 | -125: 1100000 | m: 1000000 | j:  2
126: 0111111 | -126: 0100000 | m: 0100000 | j:  4
127: 1111111 | -127: 1000000 | m: 1000000 | j:  2
Frame   0: 0 
Frame   1: 0   1 
Frame   2: 0   1   2 
Frame   3: 0   2   3 
Frame   4: 0   2   3   4 
Frame   5: 0   2   4   5 
Frame   6: 0   4   5   6 
Frame   7: 0   4   6   7 
Frame   8: 0   4   6   7   8 
Frame   9: 0   4   6   8   9 
Frame  10: 0   4   8   9  10 
Frame  11: 0   4   8  10  11 
Frame  12: 0   8  10  11  12 
Frame  13: 0   8  10  12  13 
Frame  14: 0   8  12  13  14 
Frame  15: 0   8  12  14  15 
Frame  16: 0   8  12  14  15  16 
Frame  17: 0   8  12  14  16  17 
Frame  18: 0   8  12  16  17  18 
Frame  19: 0   8  12  16  18  19 
Frame  20: 0   8  16  18  19  20 
Frame  21: 0   8  16  18  20  21 
Frame  22: 0   8  16  20  21  22 
Frame  23: 0   8  16  20  22  23 
Frame  24: 0  16  20  22  23  24 
Frame  25: 0  16  20  22  24  25 
Frame  26: 0  16  20  24  25  26 
Frame  27: 0  16  20  24  26  27 
Frame  28: 0  16  24  26  27  28 
Frame  29: 0  16  24  26  28  29 
Frame  30: 0  16  24  28  29  30 
Frame  31: 0  16  24  28  30  31 
Frame  32: 0  24  28  30  31  32 
Frame  33: 0  24  28  30  32  33 
Frame  34: 0  24  28  32  33  34 
Frame  35: 0  24  28  32  34  35 
Frame  36: 0  24  32  34  35  36 
Frame  37: 0  24  32  34  36  37 
Frame  38: 0  24  32  36  37  38 
Frame  39: 0  24  32  36  38  39 
Frame  40: 0  32  36  38  39  40 
Frame  41: 0  32  36  38  40  41 
Frame  42: 0  32  36  40  41  42 
Frame  43: 0  32  36  40  42  43 
Frame  44: 0  32  40  42  43  44 
Frame  45: 0  32  40  42  44  45 
Frame  46: 0  32  40  44  45  46 
Frame  47: 0  32  40  44  46  47 
Frame  48: 0  40  44  46  47  48 
Frame  49: 0  40  44  46  48  49 
Frame  50: 0  40  44  48  49  50 
Frame  51: 0  40  44  48  50  51 
Frame  52: 0  40  48  50  51  52 
Frame  53: 0  40  48  50  52  53 
Frame  54: 0  40  48  52  53  54 
Frame  55: 0  40  48  52  54  55 
Frame  56: 0  48  52  54  55  56 
Frame  57: 0  48  52  54  56  57 
Frame  58: 0  48  52  56  57  58 
Frame  59: 0  48  52  56  58  59 
Frame  60: 0  48  56  58  59  60 
Frame  61: 0  48  56  58  60  61 
Frame  62: 0  48  56  60  61  62 
Frame  63: 0  48  56  60  62  63 
Frame  64: 0  56  60  62  63  64 
Frame  65: 0  56  60  62  64  65 
Frame  66: 0  56  60  64  65  66 
Frame  67: 0  56  60  64  66  67 
Frame  68: 0  56  64  66  67  68 
Frame  69: 0  56  64  66  68  69 
Frame  70: 0  56  64  68  69  70 
Frame  71: 0  56  64  68  70  71 
Frame  72: 0  64  68  70  71  72 
Frame  73: 0  64  68  70  72  73 
Frame  74: 0  64  68  72  73  74 
Frame  75: 0  64  68  72  74  75 
Frame  76: 0  64  72  74  75  76 
Frame  77: 0  64  72  74  76  77 
Frame  78: 0  64  72  76  77  78 
Frame  79: 0  64  72  76  78  79 
Frame  80: 0  72  76  78  79  80 
Frame  81: 0  72  76  78  80  81 
Frame  82: 0  72  76  80  81  82 
Frame  83: 0  72  76  80  82  83 
Frame  84: 0  72  80  82  83  84 
Frame  85: 0  72  80  82  84  85 
Frame  86: 0  72  80  84  85  86 
Frame  87: 0  72  80  84  86  87 
Frame  88: 0  80  84  86  87  88 
Frame  89: 0  80  84  86  88  89 
Frame  90: 0  80  84  88  89  90 
Frame  91: 0  80  84  88  90  91 
Frame  92: 0  80  88  90  91  92 
Frame  93: 0  80  88  90  92  93 
Frame  94: 0  80  88  92  93  94 
Frame  95: 0  80  88  92  94  95 
Frame  96: 0  88  92  94  95  96 
Frame  97: 0  88  92  94  96  97 
Frame  98: 0  88  92  96  97  98 
Frame  99: 0  88  92  96  98  99 
Frame 100: 0  88  96  98  99 100 
Frame 101: 0  88  96  98 100 101 
Frame 102: 0  88  96 100 101 102 
Frame 103: 0  88  96 100 102 103 
Frame 104: 0  96 100 102 103 104 
Frame 105: 0  96 100 102 104 105 
Frame 106: 0  96 100 104 105 106 
Frame 107: 0  96 100 104 106 107 
Frame 108: 0  96 104 106 107 108 
Frame 109: 0  96 104 106 108 109 
Frame 110: 0  96 104 108 109 110 
Frame 111: 0  96 104 108 110 111 
Frame 112: 0 104 108 110 111 112 
Frame 113: 0 104 108 110 112 113 
Frame 114: 0 104 108 112 113 114 
Frame 115: 0 104 108 112 114 115 
Frame 116: 0 104 112 114 115 116 
Frame 117: 0 104 112 114 116 117 
Frame 118: 0 104 112 116 117 118 
Frame 119: 0 104 112 116 118 119 
Frame 120: 0 112 116 118 119 120 
Frame 121: 0 112 116 118 120 121 
Frame 122: 0 112 116 120 121 122 
Frame 123: 0 112 116 120 122 123 
Frame 124: 0 112 120 122 123 124 
Frame 125: 0 112 120 122 124 125 
Frame 126: 0 112 120 124 125 126 
Frame 127: 0 112 120 124 126 127 
Frame 128: 0 120 124 126 127 
Frame 129: 0 120 124 126 
Frame 130: 0 120 124 
Frame 131: 0 120 124 
Frame 132: 0 120 
Frame 133: 0 120 
Frame 134: 0 120 
Frame 135: 0 120 
Frame 136: 0 
Frame 137: 0 
Frame 138: 0 
Frame 139: 0 
Frame 140: 0 
Frame 141: 0 
Frame 142: 0 
Frame 143: 0 
Frame 144: 0 
Frame 145: 0 
Frame 146: 0 
Frame 147: 0 
Frame 148: 0 
Frame 149: 0 
Frame 150: 0 
Frame 151: 0 
Frame 152: 0 
Frame 153: 0 
Frame 154: 0 
Frame 155: 0 
Frame 156: 0 
Frame 157: 0 
Frame 158: 0 
Frame 159: 0 
Frame 160: 0 
Frame 161: 0 
Frame 162: 0 
Frame 163: 0 
Frame 164: 0 
Frame 165: 0 
Frame 166: 0 
Frame 167: 0 
Frame 168: 0 
Frame 169: 0 
Frame 170: 0 
Frame 171: 0 
Frame 172: 0 
Frame 173: 0 
Frame 174: 0 
Frame 175: 0 
Frame 176: 0 
Frame 177: 0 
Frame 178: 0 
Frame 179: 0 
Frame 180: 0 
Frame 181: 0 
Frame 182: 0 
Frame 183: 0 
Frame 184: 0 
Frame 185: 0 
Frame 186: 0 
Frame 187: 0 
Frame 188: 0 
Frame 189: 0 
Frame 190: 0 
Frame 191: 0 
Frame 192: 0 
Frame 193: 0 
Frame 194: 0 
Frame 195: 0 
Frame 196: 0 
Frame 197: 0 
Frame 198: 0 
Frame 199: 0 
Frame 200: 0 
Frame 201: 0 
Frame 202: 0 
Frame 203: 0 
Frame 204: 0 
Frame 205: 0 
Frame 206: 0 
Frame 207: 0 
Frame 208: 0 
Frame 209: 0 
Frame 210: 0 
Frame 211: 0 
Frame 212: 0 
Frame 213: 0 
Frame 214: 0 
Frame 215: 0 
Frame 216: 0 
Frame 217: 0 
Frame 218: 0 
Frame 219: 0 
Frame 220: 0 
Frame 221: 0 
Frame 222: 0 
Frame 223: 0 
Frame 224: 0 
Frame 225: 0 
Frame 226: 0 
Frame 227: 0 
Frame 228: 0 
Frame 229: 0 
Frame 230: 0 
Frame 231: 0 
Frame 232: 0 
Frame 233: 0 
Frame 234: 0 
Frame 235: 0 
Frame 236: 0 
Frame 237: 0 
Frame 238: 0 
Frame 239: 0 
Frame 240: 0 
Frame 241: 0 
Frame 242: 0 
Frame 243: 0 
Frame 244: 0 
Frame 245: 0 
Frame 246: 0 
Frame 247: 0 
Frame 248: 0 
Frame 249: 0 
Frame 250: 0 
Frame 251: 0 
Frame 252: 0 
Frame 253: 0 
Frame 254: 0 
Frame 255: 0 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment