Reprezentacja 128-bitowych liczb w C ++
Jaki jest najlepszy sposób przedstawienia 128-bitowej liczby w C ++? Powinien zachowywać się jak najbliżej wbudowanych typów liczbowych (tj. Obsługiwać wszystkie operatory arytmetyczne itp.).
Myślałem o stworzeniu klasy, która miałaby 2 64-bitowe lub 4 32-bitowe liczby. A może po prostu tworzę 128-bitowy blok pamięci i robię to sam.
Czy jest jakiś prostszy/standardowy sposób lub coś, co rzadziej zepsuję, gdy sam go wdrożę? :)
Byłoby również miło, gdyby można go było rozszerzyć do 256-bitowego, 512-bitowego itd.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
11 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
EDIT:
kiedy pierwszy raz to napisałem http://www.boost.org/doc/libs/ ... .html
jeszcze nie. Zachowanie tej odpowiedzi ze względów historycznych.
Zrobiłem już wcześniej klasę uint128, możesz to sprawdzić pod adresem:
http://www.codef00.com/code/uint128.h
http://www.codef00.com/code/uint128.h
.
Zależy od funkcji boost, aby automatycznie udostępniać wszystkie warianty operatorów matematycznych, więc musi obsługiwać wszystko, co robi natywny typ .
Istnieje kilka drobnych rozszerzeń typów wbudowanych, na przykład inicjowanie ich za pomocą następującego ciągu:
Jest poręczne makro, które działa podobnie do tych w C99, którego możesz użyć w następujący sposób:
Anonimowy użytkownik
Potwierdzenie od:
Jednak działa to tylko na procesorach 64-bitowych.
W każdym razie, aby rozwiązać ten problem, patrzysz na arytmetykę wielokrotnej precyzji. mode (TI) zmusi kompilator do wygenerowania operacji za Ciebie, w przeciwnym razie muszą one zostać zapisane jawnie.
Możesz użyć ogólnego pakietu bigint; te, które znam w C ++, obejmują pakiety teorii liczb
LiDIA
http://www.cdc.informatik.tu-d ... iDIA/
i
NTL
http://www.shoup.net/ntl/
a także pakiety bigint używane do kryptografii w Crypto ++ i Botan). plus, oczywiście, jest GnuMP, będący kanoniczną biblioteką MPI w C (i ma też opakowanie C ++, chociaż ostatnim razem wydawało mi się, że jest słabo udokumentowany). Wszystkie są zaprojektowane do szybkiego działania, ale prawdopodobnie są również skonfigurowane dla dużych (ponad 1000 bitowych) liczb, więc przy 128 bitach możesz mieć do czynienia z dużym narzutem. (Z drugiej strony nie mówisz, czy to ma znaczenie, czy nie). I wszystkie z nich (w przeciwieństwie do pakietu bigint-cpp, którym jest GPL, są BSD lub LGPL) - nie jestem pewien, czy to ma znaczenie, ale może to zrobić dużą różnicę.
Możesz także napisać niestandardowy typ, taki jak uint128_t; zwykle taka klasa implementuje prawie te same algorytmy, co normalna klasa MPI, tylko zakodowana na stałe tak, aby miała tylko 2 lub 4 elementy. Jeśli zastanawiasz się, jak zaimplementować takie algorytmy, dobrym odniesieniem jest
Rozdział 14 Przewodnika po kryptografii stosowanej
http://www.cacr.math.uwaterloo ... 4.pdf
Oczywiście zrobienie tego ręcznie jest łatwiejsze, jeśli tak naprawdę nie potrzebujesz wszystkich operacji arytmetycznych (w szczególności dzielenie i moduł są dość skomplikowane). Na przykład, jeśli chcesz tylko śledzić licznik, który hipotetycznie może przepełnić się 64-bitowymi bitami, możesz po prostu wyobrazić sobie go jako parę 64-bitowych długich i wykonać transfer ręcznie:
Z czym oczywiście będzie znacznie łatwiej sobie poradzić niż z ogólnym pakietem MPI lub niestandardową klasą uint128_t.
Anonimowy użytkownik
Potwierdzenie od:
Próbować
bigint C++
http://sourceforge.net/projects/cpp-bigint/
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
obsługuje
https://gcc.gnu.org/onlinedocs ... .html
128-bitowy typ liczby całkowitej dla procesorów, które go obsługują. Możesz uzyskać do niego dostęp za pomocą:
Aktualizacja 02020-02-10: zgodnie z
to
https://quuxplusone.github.io/ ... ral/: GCC, Clang i Intel ICC obsługują wbudowany typ _ _ int128.
Anonimowy użytkownik
Potwierdzenie od:
GMP
http://www.gmplib.org/
Anonimowy użytkownik
Potwierdzenie od:
GMP
http://gmplib.org/
może z pewnością rozwiązać twój problem, chociaż jest to przesada w przypadku liczb całkowitych o stałym rozmiarze, a także nieco kłopotliwe w użyciu (jest to biblioteka C, a nie C ++).
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
http://sourceforge.net/projects/cpp-bigint
http://sourceforge.net/projects/cpp-bigint/
/
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
więc nie jestem pewien, jakie operacje matematyczne są dla niego zaimplementowane