93 lines
2.1 KiB
Rust
93 lines
2.1 KiB
Rust
use spinoza::utils::padded_bin;
|
|
|
|
fn print_pairs() {
|
|
let timer = std::time::Instant::now();
|
|
let n = 6;
|
|
let p2n = 1 << n;
|
|
|
|
let t = 0;
|
|
let p2t = 1 << t;
|
|
|
|
let c = 3;
|
|
let p2c = 1 << (c + 1);
|
|
|
|
let p2m = 1 << (c - t - 1);
|
|
|
|
for i in 0..p2m {
|
|
for j in (2 * i + 2 * p2m + 1) * p2t..(2 * i + 2 * p2m + 2) * p2t {
|
|
// println!("{} = {}", j, padded_bin(j, n));
|
|
for k in (j..j + p2n).step_by(p2c) {
|
|
println!("{} = {}", k, padded_bin(k, n));
|
|
}
|
|
}
|
|
}
|
|
|
|
println!("time elapsed: {} us ... ", timer.elapsed().as_micros());
|
|
}
|
|
|
|
fn print_target_pairs() {
|
|
let n = 3;
|
|
|
|
let target = 1;
|
|
let dist = 1 << target;
|
|
|
|
// 2 for loops
|
|
println!("for loops");
|
|
for i in 0..1 << (n - 1 - target) {
|
|
for j in 2 * i * dist..(2 * i + 1) * dist {
|
|
println!(
|
|
"{} = {} -> {} = {}",
|
|
j,
|
|
padded_bin(j, n),
|
|
dist + j,
|
|
padded_bin(dist + j, n)
|
|
)
|
|
}
|
|
}
|
|
|
|
// divmod
|
|
println!("\ndivmod");
|
|
for i in 0..1 << (n - 1) {
|
|
// let (p, s) = (i / dist, i % dist);
|
|
// i = dist*p + s
|
|
let j = i + ((i >> target) << target); //i + (p << target); // i + dist*p; // 2 * dist * p + s;
|
|
println!(
|
|
"{} = {} -> {} = {}",
|
|
j,
|
|
padded_bin(j, n),
|
|
dist + j, // i + ((1 + (i >> target)) << target),
|
|
padded_bin(dist + j, n)
|
|
)
|
|
}
|
|
|
|
// bit manipulation
|
|
println!("\nbit manipulation");
|
|
let neg_dist = !0 << target;
|
|
for i in 0..1 << (n - 1) {
|
|
let j = i + (i & neg_dist);
|
|
println!(
|
|
"{} = {} -> {} = {}",
|
|
j,
|
|
padded_bin(j, n),
|
|
dist + j,
|
|
padded_bin(dist + j, n)
|
|
)
|
|
}
|
|
|
|
for target in 0..n {
|
|
for i in 0..1 << (n - 1) {
|
|
assert_eq!(
|
|
(i >> target) << target,
|
|
i & !0 << target,
|
|
"different for {}",
|
|
i
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
print_target_pairs();
|
|
print_pairs();
|
|
}
|