Ok, vì vậy PHP không phải là ngôn ngữ tốt nhất để xử lý các số nguyên lớn tùy ý, xem xét nó chỉ hỗ trợ các số nguyên đã ký 32 bit. Những gì tôi đang cố gắng làm là tạo ra một lớp có thể đại diện cho một số nhị phân lớn tùy ý và có thể thực hiện các phép tính số học đơn giản trên hai trong số chúng (cộng/trừ/nhân/chia).Số học với số nguyên lớn tự do trong PHP
Mục tiêu của tôi là xử lý các số nguyên 128 bit.
Có một vài cách tiếp cận mà tôi đang xem và các vấn đề tôi thấy với chúng. Bất kỳ đầu vào hoặc bình luận về những gì bạn sẽ chọn và làm thế nào bạn có thể đi về nó sẽ được đánh giá rất nhiều.
Cách tiếp cận # 1: Tạo lớp nguyên 128 bit lưu trữ số nguyên nội bộ dưới dạng bốn số nguyên 32 bit. Vấn đề duy nhất với cách tiếp cận này là tôi không chắc chắn làm thế nào để đi về xử lý các vấn đề tràn/tràn khi thao tác từng phần của hai toán hạng.
Phương pháp tiếp cận # 2: Sử dụng phần mở rộng bcmath, vì nó trông giống như thứ gì đó được thiết kế để giải quyết. Nỗi lo duy nhất của tôi khi sử dụng phương pháp này là thiết lập tỷ lệ của phần mở rộng bcmath, vì không thể có bất kỳ lỗi làm tròn nào trong các số nguyên 128 bit của tôi; chúng phải chính xác. Tôi cũng lo lắng về việc có thể cuối cùng chuyển đổi kết quả của các chức năng bcmath thành một chuỗi nhị phân (mà sau này tôi sẽ cần phải xô vào một số chức năng mã hóa mcrypt).
Cách tiếp cận # 3: Lưu các số dưới dạng chuỗi nhị phân (có thể là LSB trước). Về mặt lý thuyết, tôi có thể lưu trữ các số nguyên của bất kỳ kích thước tùy ý theo cách này. Tất cả những gì tôi phải làm là viết bốn hàm số học cơ bản để thực hiện thêm/sub/mult/div trên hai chuỗi nhị phân và tạo ra một kết quả chuỗi nhị phân. Đây chính xác là định dạng mà tôi cần phải chuyển giao cho mcrypt, vì vậy đó là một cộng thêm. Đây là cách tiếp cận mà tôi nghĩ có lời hứa nhất vào lúc này, nhưng điểm gắn bó tôi nhận được là PHP không cung cấp cho tôi bất kỳ cách nào để thao tác các bit riêng lẻ (mà tôi biết). Tôi tin rằng tôi sẽ phải chia nó thành các khối có kích thước bằng byte (không có ý định chơi chữ), tại thời điểm đó các câu hỏi của tôi về xử lý tràn/tràn từ Phương pháp tiếp cận # 1 được áp dụng.
Cảm ơn, trông giống như một phần mở rộng rất mượt mà! –
Nếu bạn đang chạy PHP x64 trên Windows, bạn đã hết may mắn với phần mở rộng GMP.Có vẻ như người duy trì thư viện GMP đã không chuyển nó sang Windows x64, mặc dù nó có sẵn cho Linux x64. Để giải quyết vấn đề này, bạn có thể sử dụng MySQL nếu bạn đang sử dụng nền tảng Cơ sở dữ liệu đó trong dự án của mình. MySQL hỗ trợ các số nguyên 64 bit và có rất nhiều toán tử boolean và một hàm chuyển đổi cơ bản. Tôi đã viết một lớp đơn giản để tạo thuận lợi cho điều này trong dự án của tôi. –