pub fn spread(x: u32) -> u64 {
let mut ans = x as u64;
ans = (ans | (ans << 16)) & 0x0000ffff0000ffff;
ans = (ans | (ans << 8)) & 0x00ff00ff00ff00ff;
ans = (ans | (ans << 4)) & 0x0f0f0f0f0f0f0f0f;
ans = (ans | (ans << 2)) & 0x3333333333333333;
ans = (ans | (ans << 1)) & 0x5555555555555555;
ans
}
pub fn interleave(lat: u32, lng: u32) -> u64 {
spread(lat) | (spread(lng) << 1)
}
pub fn quantize(lat: f64, base: f64) -> u32 {
((lat*base + 1.5).to_bits() >> 20) as u32
}
pub fn encode(lat: f64, lng: f64) -> u64 {
interleave(quantize(lat, 0.005555555555555556), quantize(lng, 0.002777777777777778))
}