2011-07-06 7 views
3

Windows (MSVC 2010)에서 MPIR 2.4.0을 사용 중이고 mpz_t 번호에 부호없는 64 비트 정수를 추가하려고했습니다. 그러나 MPIR/GMP는 64 비트 정수와 mpz_t 사이의 직접 변환을 지원하지 않습니다. 이것은 내 uint64를 문자열로 변환하고 mpz_init_set_str을 통해 이것을 읽어야한다는 것을 의미합니까? 이것은 매우 매력적이지 않으며 매우 빠르게 보이지도 않습니다.uint64를 GMP/MPIR 번호로 변환

내가 뭔가를 놓치거나 여기에서 사용하는 트릭/해킹이 무엇입니까? 당신은 LP64 모델을 사용하지 않는 플랫폼 (윈도우)에 있다면

건배,

필립

답변

5

. mpz_set_ux()/sx() 및 mpz_get_ux()/sx()를 참조하십시오. 이 기능들은 GMP에는 없지만 MPIR 2.4.0 매뉴얼에 설명되어 있습니다.

+0

스티븐 캐논 (Stephen Canon)이 이미 말했듯이, 나는이 함수를 인식하지 못했고, 매우 유용했다. :) 그러나 나는 여전히이 크기의 라이브러리가 int64를 고려하지 않는 것이 이상하다고 생각한다. –

1

예, 다음에 64 비트 정수를 할당 할 기능이 없다 mpz_t. 문자열을 처리하는 대신 64 비트 정수의 상위 절반과 하위 절반을 개별적으로 할당 한 다음이를 더할 수 있습니다. 아직도 깨끗하지는 않지만 거의 확실합니다.

편집 : 참조 Banthar의 대답은 훨씬 더 좋은 해결 방법입니다.

3

사용 mpz_import :

void mpz_set_ull(mpz_t rop, unsigned long long op) 
{ 
    mpz_import(rop, 1, 1, sizeof(op), 0, 0, &op); 
} 

편집 : Frank's comment에 따라 업데이트 코드입니다. intmax_t 및 uintmax_t에 대한

mpz_import(b, 1, 1, sizeof(a), 0, 0, &a); 
+0

아, 아주 좋습니다. 이 기능을 알지 못했습니다. –

+0

더 멋져 보이지만 엔디안을 다루어야합니다. 이 코드가 올바르게 처리되는지 확실하지 않습니다. –

0

MPIR 2.4을 도입 지원 : Banthar 사용 mpz_import에 의해 제안,하지만 난 플랫폼 엔디안에 의존하지 않는 다음 사항을 건의 할 것으로

관련 문제