Итак, PHP не лучший язык для работы с произвольно большими целыми числами, учитывая, что он только изначально поддерживает 32-разрядные целые числа. То, что я пытаюсь сделать, это создать класс, который может представлять произвольно большое двоичное число и иметь возможность выполнять простые арифметические операции над двумя из них (add/subtract/multiply/divide).Арифметика с произвольно большими целыми числами в PHP
Моя цель имеет дело с 128-битными целыми числами.
Есть несколько подходов, на которые я смотрю, и проблемы, которые я вижу с ними. Будем очень благодарны за любые комментарии или комментарии относительно того, что вы бы выбрали и как вы могли бы пойти по этому поводу.
Подход №1: Создайте 128-битный целочисленный класс, который хранит его целое число как четыре 32-битных целых числа. Единственная проблема с этим подходом заключается в том, что я не уверен, как обращаться с проблемами переполнения/недогрузки при манипулировании отдельными фрагментами двух операндов.
Подход № 2: Используйте расширение bcmath, так как это выглядит как нечто, предназначенное для решения проблемы. Мое единственное беспокойство в этом подходе - это установка масштаба для расширения bcmath, потому что в моих 128-битных целых числах не может быть ошибок округления; они должны быть точными. Я также обеспокоен тем, что могу в конечном итоге преобразовать результат функций bcmath в двоичную строку (которую позже мне нужно будет вдавить в некоторые функции шифрования mcrypt).
Подход № 3: Сохраните номера в виде двоичных строк (возможно, сначала LSB). Теоретически я должен иметь возможность хранить целые числа любого произвольного размера таким образом. Все, что мне нужно сделать, это написать четыре основные арифметические функции для выполнения add/sub/mult/div в двух двоичных строках и создать результат двоичной строки. Это именно тот формат, который мне нужно передать в mcrypt, так что это плюс плюс. Это тот подход, который, на мой взгляд, наиболее перспективен на данный момент, но одна из тех, которые я имею в виду, заключается в том, что PHP не предлагает мне никакого способа манипулировать отдельными битами (что я знаю). Я считаю, что мне пришлось бы разбить его на кусочки размером в байты (не каламбур), и в этот момент мои вопросы об обработке переполнения/недостаточного потока из подхода №1 применяются.
Спасибо, это похоже на очень гладкое расширение! – 2009-09-05 05:01:27