Python имеет целые числа бесконечной точности, так что вы можете легко кодировать это, используя два диапазона в одном и том же целом числе.
Сначала решите, какая точность вам нужна. Допустим, он равен 9,5 (до 9 общих цифр и до 5 цифр после десятичной точки), а координату, которую нужно кодировать, (107.13, 52.22).
Сначала вы найдете следующую наивысшую степень 2, превышающую 10 ^ 9, то есть 2 ^ 30.
Затем вы должны дополнить X и Y до 9 цифр без десятичный, т. е. (10713000, 5222000).
Рассматривая X как часть нижнего порядка объединенного значения, вы добавляете X к сдвинутому вверх значению Y:
10713000 + (5222000 << 30)
Теперь у вас есть большое число, которое имеет Y в верхних битах и X в нижних без возможности перекрытия.
Это быстро, потому что не требует умножения, только сдвиг битов. Возможно, будет немного быстрее заменить +
на |
(побитовое ИЛИ), поскольку мы знаем, что нет перекрывающихся битов.
Как декодировать значения позже легко - две битовые маски и >> 30
сделают это.
Вы можете бороться с негативами, проверяя свой диапазон и используя смещение. Если допустимые значения имеют точность +/- 9,5, просто добавьте 999999999 к каждому значению перед кодированием (таким образом, самое низкое действительное значение соответствует 0, а самое высокое действительное значение соответствует 999999999 x 2, и увеличьте число сдвигов битов на единицу:
(10713000 + 999999999) | ((5222000 + 999999999) << 31)
Вот пара дополнительных скобок, чтобы было понятно.