[Odin] Bits iterator with arbitrary step[Odin] Bits iterator with arbitrary step

👝

BIP 39

Week 39, 2026

package main import "core:fmt" import "core:strings" import "core:crypto/hash" import "core:math" import "core:math/bits" main :: proc () { words_2048 := load_words(#load("words.txt", string), 2048) // bytes_32 := [32] byte { 164,215,213,131,229,33,0,124,224,79,124,203,0,22,112,152,113,93,34,121,73,117,200,163,206,127,192,184,106,6,213,237 } bytes_32 := [32] byte { 55,87,237,88,48,57,128,112,97,44,22,199,125,188,153,242,215,226,41,248,84,142,60,77,87,94,146,232,251,220,6,110 } bytes_32_hash := hash.hash_bytes(.SHA256, bytes_32[:]) bytes_33: [33] byte = { **bytes_32, bytes_32_hash[0] } it := bits_iterate(bytes_33[:]) for i in bits_next(&it, 11) do fmt.print(words_2048[i], "") fmt.println() } load_words :: proc (text: string, $N: int) -> (words: [N] string) { i := 0 text := text for s in strings.split_lines_iterator(&text) { w := strings.trim_space(s) assert(i < len(words)) words[i] = w i += 1 } assert(i == len(words)) return } Bits_Iterator :: struct { stream : [] byte, bit_i : uint, } bits_iterate :: proc (stream: [] byte) -> Bits_Iterator { return { stream=stream } } bits_next :: proc (it: ^Bits_Iterator, step: uint) -> (value: uint, ok: bool) { assert(step <= 8 * size_of(value)) (it.bit_i + step <= 8 * uint(len(it.stream))) or_return for i in 0..