development

C ++에서 128 비트 숫자 표시

big-blog 2021. 1. 6. 20:44
반응형

C ++에서 128 비트 숫자 표시


C ++에서 128 비트 숫자를 표현하는 가장 좋은 방법은 무엇입니까? 가능한 한 내장 숫자 유형에 가깝게 작동해야합니다 (즉, 모든 산술 연산자 지원 등).

64 비트 2 개 또는 32 비트 숫자 4 개를 가진 클래스를 만들 생각이었습니다. 또는 128 비트 메모리 블록을 만들고 모든 작업을 직접 수행 할 수도 있습니다.

더 쉽고 / 더 표준적인 방법이 있습니까, 아니면 직접 구현할 때 망칠 가능성이 적은 것이 있습니까? :)

256 비트, 512 비트 등으로 확장 할 수 있다면 좋을 것입니다.


개발 된 다른 라이브러리를 살펴보십시오. 많은 사람들이 당신보다 먼저 이것을하고 싶어했습니다. :디

bigint C ++ 사용해보기


편집 : 내가 처음 썼을 때 이것은 boost::multiprecision::uint128_t아직 일이 아닙니다. 역사적인 이유로이 답변을 유지합니다.


전에 uint128 클래스를 만들었습니다. http://www.codef00.com/code/uint128.h 에서 확인할 수 있습니다 .

수학 연산자의 모든 변형을 자동으로 제공하기 위해 부스트에 의존하므로 기본 unsigned int유형이 수행 하는 모든 것을 지원해야합니다 .

다음과 같은 문자열로 초기화하는 것과 같이 내장 유형에 대한 몇 가지 사소한 확장이 있습니다.

uint128_t x("12345678901234567890");

다음과 같이 사용할 수있는 C99의 매크로와 유사하게 작동하는 편리한 매크로가 있습니다.

uint128_t x = U128_C(12345678901234567890);

이것은 다소 특별한 경우입니다. 특히 찾고있는 플랫폼을 지정하지 않았기 때문에 GCC를 사용하면 모드 (TI)를 사용하여 128 비트 작업을 (합성) 얻을 수 있습니다. 예:

   typedef unsigned int uint128_t __attribute__((mode(TI)));

   uint64_t x = 0xABCDEF01234568;
   uint64_t y = ~x;

   uint128_t result = ((uint128_t) x * y);

   printf("%016llX * %016llX -> ", x, y);

   uint64_t r1 = (result >> 64);
   uint64_t r2 = result;

   printf("%016llX %016llX\n", r1, r2);

그러나 이것은 64 비트 프로세서에서만 작동합니다.

어떤 식 으로든이 문제를 해결하기 위해 다중 정밀도 산술을 찾고 있습니다. mode (TI)는 컴파일러가 작업을 생성하도록합니다. 그렇지 않으면 명시 적으로 작성해야합니다.

일반적인 bigint 패키지를 사용할 수 있습니다. 내가 아는 C ++에는 숫자 이론 패키지 LiDIANTLCrypto ++Botan의 암호화 코드에 사용되는 bigint 패키지가 포함됩니다 . 물론 표준 C MPI 라이브러리 인 GnuMP 가 있습니다 (그리고 C ++ 래퍼도 포함하고 있지만 지난번에 문서화가 제대로되지 않은 것 같습니다). 이들 모두는 빠르도록 설계되었지만 더 큰 (1000 비트 이상) 수에 맞게 조정될 수도 있으므로 128 비트에서는 많은 오버 헤드를 처리 할 수 ​​있습니다. (다른 한편으로는 그것이 중요한지 아닌지 말하지 않습니다). 그리고 그들 모두 (GPL 인 bigint-cpp 패키지와 달리 BSD 또는 LGPL 중 하나입니다)-중요한지 확실하지 않지만 많이 중요 할 수 있습니다.

사용자 정의 uint128_t 유형의 유형을 작성할 수도 있습니다. 일반적으로 이러한 클래스는 일반 MPI 클래스와 거의 동일한 알고리즘을 구현하며 2 개 또는 4 개의 요소 만 갖도록 하드 코딩됩니다. 이러한 알고리즘을 구현하는 방법이 궁금하다면 Applied Cryptography 핸드북 14 장을 참조 하십시오.

물론 모든 산술 연산이 실제로 필요하지 않은 경우 수동으로이 작업을 수행하는 것이 더 쉽습니다 (특히 분할과 모듈로가 다소 까다 롭습니다). 예를 들어, 가상적으로 64 비트를 오버플로 할 수있는 카운터를 추적해야하는 경우 64 비트 long long 쌍으로 표시하고 손으로 수행 할 수 있습니다.

unsigned long long ctrs[2] = { 0 };

void increment() {
   ++ctrs[0];
   if(!ctrs[0]) // overflow
     ++ctrs[1];
}

물론 일반적인 MPI 패키지 나 사용자 정의 uint128_t 클래스보다 다루기가 훨씬 더 간단합니다.


Boost has data types in multiprecision library for types ranging from 128 to 1024 bits.

#include <boost/multiprecision/cpp_int.hpp>

using namespace boost::multiprecision;

int128_t mySignedInt128 = -1;
uint128_t myUnsignedInt128 = 2;
int256_t mySignedInt256 = -3;
uint256_t myUnsignedInt256 = 4;
int512_t mySignedInt512 = -5;
uint512_t myUnsignedInt512 = 6;
int1024_t mySignedInt1024 = -7;
uint1024_t myUnsignedInt1024 = 8;

GCC supports a 128-bit integer type for processors which support it. You can access it using:

__int128          a;
unsigned __int128 b;

Don't reinvent the wheel -- I'm positive other people have already solved this problem, although I can't name any solutions off the top of my head. GMP can surely solve your problem, although it's overkill for fixed-size integers, and it's also a little cumbersome to use (it's a C library, not C++).


You may want to try GMP


Here is a library I found on google.

http://sourceforge.net/projects/cpp-bigint/


You might be better off with an infinite-precision integer class, rather than a sequence of increasing size. Some languages (like Common Lisp and IIRC Python) have them natively. I'm not sure offhand what's available for C++; last I looked there wasn't a Boost version.


The cairo graphics library has two files which implement portable 128-bit integer arithmetic: cairo-wideint-private.h, cairo-wideint.c. We include just these two in our project to get 128-bits.


In Visual Studio C++ there is a type FLOAT128 that is used to represent 128-bit integers. It is implemented as:

#if defined(_M_IA64) && !defined(MIDL_PASS)
__declspec(align(16))
#endif
typedef struct _FLOAT128 {
    __int64 LowPart;
    __int64 HighPart;
} FLOAT128;

so I'm not sure about what math operations are implemented for it

ReferenceURL : https://stackoverflow.com/questions/1188939/representing-128-bit-numbers-in-c

반응형