2009-07-08 11 views
10

Po pierwsze muszę zapytać:
Czy ktoś wie o bieżącej realizacji 128b UINT dla Java?Java: Wdrażanie 128bit bez znaku Integer

Potrzebuję czegoś do przechowywania naturalnych wartości kardynalnych. tj: Wielki licznik.
Wiem o BigIntegers, które są wolne i niezmienne. UU 128b ma sens ...

Myślałem o implementacji OWORDa, używając pary prymitywnych longów.

Przepełnienia spowodowałyby wyjątek, a nie zawijanie.

Jaki przykład kodu źródłowego/blogów powinienem szukać w celu implementacji działania tej klasy?

+0

Wdrożono coś podobnego rok temu, a jedyne, co mogę powiedzieć, to: mam nadzieję, że nie będziesz musiał implementować dokładnego modulo/division ...;) – Tim

+2

Możesz pobrać MutableBigInteger z OpenJDK http://www.docjar.org /html/api/java/math/MutableBigInteger.java.html – akarnokd

Odpowiedz

0

Dlaczego nie używać BigInteger?

+10

BigInteger jest _slow_, gdy wszystko, czego potrzebujesz, to tylko trochę ponad 64 bity. Zrobiło to się rok temu i okazało się 25 razy wolniejsze od oryginału . Zobacz tę odpowiedź dla szczegółów: http://stackoverflow.com/questions/962747/most-hameful-awesome-language-hack/1084538#1084538 – Tim

+9

Dziwne, że jest to zaakceptowana odpowiedź, biorąc pod uwagę, że PO powiedział, że nie chce BigInteger . –

+4

Tim, Twój komentarz zawiera zepsuty link. – Gili

4

Używałbym 32-bitowych liczb całkowitych jako reprezentacji, ponieważ potrzebny jest większy typ (długi) w celu uzyskania dodatkowej precyzji dla bitu nośnego, wykrywania przepełnienia i mnożenia. Pomyśl o 32-bitowej liczbie całkowitej jako cyfrze i zastosuj algorytmy ze szkoły podstawowej.

+1

Możesz użyć długości 64 bitów tylko dobrze ==> dwa razy szybciej. Przeprowadzenie może być określone przez zmianę bitu znaku. –

+0

@Ira Baxter Wątpię, że byłoby szybciej. Byłoby to możliwe, ale bardziej skomplikowane dla dodawania, ale nie dla multiplikacji. Java BigInteger używa int [] i przypuszczam, że wiedzą, co robią. – starblue

+0

Jeśli chcesz uzyskać pakiet BigInt o bardzo wysokiej wydajności, używaj największego słownika dostępnego dla twojego komputera, dla którego istnieje obsługa instrukcji natywnych. W dzisiejszych czasach trudno znaleźć komputer, który nie jest 64-bitowy. Stoję na mojej pozycji: używaj długiego. Algorytmy w pakiecie BigInt są prawdopodobnie typowe dla większości pakietów wieloprecyzyjnych; długi powinien opadać stosunkowo łatwo na miejsce. Dodatki dużych rozmiarów teraz zajmują połowę cykli. Multiplikacje powinny być 4 razy szybsze, ponieważ potrzebujesz tylko jednego produktu zamiast 4 pół-szerokich produktów. –

3

Nie mów mi, że planujesz mieć 128 ustawiaczy statycznych i pobierających, po jednym dla każdego bitu ??? Zdecydowanie idę do setBit (indeks int, wartość boolowska) i getBit (int index) jako metody instancji.

Więcej rzeczy, których potrzebujesz: metoda toString(), dzięki której możesz uzyskać reprezentację czytelną dla człowieka (w pewnym momencie będziesz chciał wydrukować liczby, jak sądzę).

Pamiętaj, że wszystkie typy porządkowe w java są podpisane (z wyjątkiem char), więc jeśli planujesz użyć dwóch długich, pamiętaj, że dolna część może być problematyczna w wykrywaniu przepełnień i takich ... tak czy inaczej, będziesz miał 127-bitowy numer chyba, że ​​niższa część będzie traktowana jako 63-bitowa bez znaku.

+0

Skąd wziął się nawet OP na setery dla każdego bitu? –

+0

http://stackoverflow.com/revisions/1096964/list, powinieneś spojrzeć przed krytyką. – fortran

+1

OK, teraz to widzę. Nie spodziewałem się, że będę musiał przeczytać poprawki na pytanie, aby to zrozumieć; to wydaje się nieco przesadzone. Rezygnowałem z twojej odpowiedzi. –

Powiązane problemy