bit_combi_iter is a small dependency-free crate to enumerate all bit combinations less than given unsigned integer value keeping the number of bits.
use bit_combi_iter::BitCombinations;
fn main() {
let u = 0b00010100u8;
let mut c = BitCombinations::new(u);
println!("{:#b}", c.next().unwrap()); // => 0b00010010
println!("{:#b}", c.next().unwrap()); // => 0b00010001
println!("{:#b}", c.next().unwrap()); // => 0b00001100
println!("{:#b}", c.next().unwrap()); // => 0b00001010
println!("{:#b}", c.next().unwrap()); // => 0b00001001
println!("{:#b}", c.next().unwrap()); // => 0b00000110
println!("{:#b}", c.next().unwrap()); // => 0b00000101
println!("{:#b}", c.next().unwrap()); // => 0b00000011
println!("{}", c.next().is_none()); // => true
}
This crate is useful when you want to enumerate all n
bit integers including k
ones.
// Enumerate all 5 bit integers including 3 ones (as u8)
BitCombinations::new(0b11100u8)
// 11100
// 11010
// 11001
// 01110
// ...
Add this crate to dependencies in your Cargo.toml
.
[dependencies]
bit_combi_iter = "1"
A struct implementing Iterator<Item=U>
. Size of this struct is the same as size of U
. No additional allocation is necessary.
new
generates a BitCombinations
instance initializing with state init
.
next
method generates a next bit combination of the current state. The generated value is always smaller than the next state.
peek
method returns the current state. When the iterator finished iterating all combinations, this method returns None
.
The algorithm was borrowed from the blog post by @herumi.
Distributed under the MIT License.