Предполагая, что у вас есть 32-битная арифметика: 2 ** 24 = 16777216, таким образом, принимая x в качестве старшего значащего 2 байта и y в качестве младшего значащего 3:
(16777216 * x + y) / 1000
= (16777000 * x + 216 * x + y) / 1000
= 16777 * x + (216 * x + y) / 1000
Первый член может быть вычислен в 32 битах без переполнения (начиная с x < 2**16
).
Второй член также может быть вычислен без переполнения (так как x < 2**16
и y < 2**24
).
Это в основном длинное деление по основанию 2**24
двухзначного значения, но с предварительно вычисленными терминами, зная, что делитель равен 1000. Одна тысяча выбрана, потому что ее наименьшая степень 10 больше 2**8
.
Итак, сначала вычислите три младшие цифры, используйте тот факт, что (2**32) % 1000 == 296
. Так что на этот раз мы возьмем х в качестве старшего байта и у в качестве младших 4 байта
((2**32) * x + y) % 1000 = ((2**32) * x) % 1000 + y % 1000 (modulo 1000)
= (296 * x) % 1000 + y % 1000 (modulo 1000)
((2**32) * x + y) % 1000 = ((296 * x) % 1000 + y % 1000) % 1000
Затем разделите оригинальное число на 1000, используя формулу выше. Тогда вы благополучно войдете в 32-битную территорию и сможете использовать оставшиеся цифры, используя обычный цикл.
Кстати, я бы проверил результаты на вашем месте: я не проверял это и, возможно, где-то допустил ошибку. Это должно быть легко сравнить с результатами преобразования bcd, выполненного обычным способом в 64-разрядном целом числе на ПК.