rust_algorithms/
geohash.rs

1pub fn spread(x: u32) -> u64 {
2    let mut ans = x as u64;
3    ans = (ans | (ans << 16)) & 0x0000ffff0000ffff;
4    ans = (ans | (ans << 8)) & 0x00ff00ff00ff00ff;
5    ans = (ans | (ans << 4)) & 0x0f0f0f0f0f0f0f0f;
6    ans = (ans | (ans << 2)) & 0x3333333333333333;
7    ans = (ans | (ans << 1)) & 0x5555555555555555;
8    ans
9}
10
11pub fn interleave(lat: u32, lng: u32) -> u64 {
12    spread(lat) | (spread(lng) << 1)
13}
14
15pub fn quantize(lat: f64, base: f64) -> u32 {
16    ((lat*base + 1.5).to_bits() >> 20) as u32
17}
18
19pub fn encode(lat: f64, lng: f64) -> u64 {
20    interleave(quantize(lat, 0.005555555555555556), quantize(lng, 0.002777777777777778))
21}