2009-07-08 50 views
10

đầu tiên ra tôi nên hỏi:
Có ai biết của một thi 128B UINT hiện tại cho Java?Java: Thực hiện một 128bit Integer Unsigned

Tôi cần một cái gì đó để giữ giá trị tự nhiên. tức là: Một bộ đếm lớn.
Tôi biết về BigIntegers, chậm và không thay đổi. A 128b UINT có ý nghĩa ...

Tôi đã suy nghĩ về việc triển khai OWORD, sử dụng một cặp dài nguyên thủy.

Các luồng sẽ ném ngoại lệ và không phải là bao quanh.

Tôi nên xem xét ví dụ về sourcecode/blog nào để triển khai các hoạt động của lớp học này?

+0

Thực hiện điều gì đó tương tự cách đây một năm và tất cả những gì tôi có thể nói là: Tôi chắc chắn hy vọng bạn sẽ không thực hiện modulo/phân chia chính xác ...;) – Tim

+2

Bạn có thể lấy MutableBigInteger từ OpenJDK http://www.docjar.org /html/api/java/math/MutableBigInteger.java.html – akarnokd

Trả lời

0

Tại sao không sử dụng BigInteger?

+10

BigInteger là _slow_ khi tất cả những gì bạn cần chỉ là một chút trên 64 bit .. Đã chuyển sang vấn đề này một năm trước và hóa ra chậm hơn 25 lần so với bản gốc dài . Xem anwer này để biết chi tiết: http://stackoverflow.com/questions/962747/most-shameful-awesome-language-hack/1084538#1084538 – Tim

+9

Odd rằng đây là câu trả lời được chấp nhận, xem xét OP cho biết anh ấy không muốn BigInteger . –

+4

Tim, nhận xét của bạn chứa liên kết bị hỏng. – Gili

4

Tôi sẽ sử dụng số nguyên 32 bit làm biểu diễn, vì bạn cần loại lớn hơn (dài) để có độ chính xác cao hơn cho bit mang, phát hiện tràn và phép nhân. Hãy suy nghĩ về một số nguyên 32 bit như một chữ số và áp dụng các thuật toán từ trường tiểu học.

+1

Bạn có thể sử dụng độ dài 64 bit chỉ tốt ==> nhanh gấp hai lần. Việc thực hiện có thể được xác định bằng các thay đổi đối với bit dấu. –

+0

@Ira Baxter Tôi nghi ngờ nó sẽ nhanh hơn. Nó sẽ có thể nhưng phức tạp hơn để bổ sung, nhưng không phải cho phép nhân. Java BigInteger sử dụng int [], và tôi cho rằng họ biết họ đang làm gì. – starblue

+0

Nếu bạn muốn có một gói BigInt hiệu suất rất cao, bạn sử dụng các từ lớn nhất có sẵn cho máy của bạn, trong đó có sự hỗ trợ chỉ dẫn của máy bản địa. Thật khó để tìm thấy một PC những ngày này không phải là 64 bit. Tôi đứng ở vị trí của tôi: sử dụng một thời gian dài. Các thuật toán trong gói BigInt có lẽ là điển hình của hầu hết các gói đa gói; dài nên thả tương đối dễ dàng vào vị trí. Bổ sung các bigints lớn bây giờ chỉ đơn giản là mất một nửa như nhiều chu kỳ. Phép nhân phải là 4x nhanh vì bạn chỉ cần 1 sản phẩm thay vì 4 sản phẩm chéo một nửa. –

3

Đừng nói với tôi rằng bạn định có 128 bộ định tuyến tĩnh và getters, một cho mỗi bit ??? Tôi chắc chắn sẽ đi cho setBit (int index, boolean value) và getBit (int index) như là các phương thức instance.

Nhiều thứ bạn cần: phương thức toString() để bạn có thể có được biểu diễn có thể đọc được của con người (tại một số thời điểm bạn sẽ muốn in số, tôi nghĩ). Hãy nhớ rằng tất cả các loại thứ tự trong java được ký (ngoại trừ char), vì vậy nếu bạn có kế hoạch sử dụng hai thời gian dài, hãy luôn ghi nhớ rằng phần dưới có thể là vấn đề để phát hiện tràn và như vậy ... anyway, bạn sẽ có một số 127 bit trừ khi bởi vì phần dưới sẽ được coi là không dấu 63 bit.

+0

OP ở đâu cũng gợi ý tại các bộ định vị cho mỗi bit? –

+0

http://stackoverflow.com/revisions/1096964/list bạn nên xem trước khi chỉ trích. – fortran

+1

OK, giờ tôi đã thấy. Tôi không ngờ tôi phải đọc các bản sửa đổi của một câu hỏi để hiểu nó; có vẻ hơi hơn một chút. Tôi đã không trả lời câu trả lời của bạn. –

Các vấn đề liên quan