Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C GMP中的基数16到基数2^64转换_C_Binary_Gmp_Base Conversion_Exponentiation - Fatal编程技术网

C GMP中的基数16到基数2^64转换

C GMP中的基数16到基数2^64转换,c,binary,gmp,base-conversion,exponentiation,C,Binary,Gmp,Base Conversion,Exponentiation,我读了一些十六进制数,然后我想把它们转换成基数2^64。不幸的是,由于这个数字不能存储在int中,所以GMP中似乎没有任何函数可以帮助我解决这个问题 有没有其他我完全不知道的方法 (程序是C的)10在基数2^1中是1010,在二进制中是1010 基数2^2中的10是22,二进制中的10是10 基数2^3中的10是12,二进制中的是001 010 基数2^4中的10是A,二进制形式是1010 我试图向您展示的模式(其他人也注意到)是它们都有相同的二进制表示。换句话说,如果您将数字转换为以256为基

我读了一些十六进制数,然后我想把它们转换成基数2^64。不幸的是,由于这个数字不能存储在int中,所以GMP中似乎没有任何函数可以帮助我解决这个问题

有没有其他我完全不知道的方法


(程序是C的)

10在基数2^1中是
1010
,在二进制中是
1010

基数2^2中的10是
22
,二进制中的10是
10

基数2^3中的10是
12
,二进制中的是
001 010

基数2^4中的10是
A
,二进制形式是
1010

我试图向您展示的模式(其他人也注意到)是它们都有相同的二进制表示。换句话说,如果您将数字转换为以256为基数(
char
s)并将其写入文件或内存,则可以以2^16为基数(一次读取2个字节)或以2^32为基数(一次读取4个字节)读取该数字,或者实际上可以读取任何内容。它将是相同的二进制表示形式(假设您的Endian是正确的)。因此,在使用大尾端和小尾端时要小心,读作
int64\t

明确地说,这只适用于2^n的基底。基数5中的10为
20
,二进制为
010 000
;显然不同。但是如果你使用三元组,同样的原理也适用于3^n,而在五元组(?)中,它也适用于5^n

更新:如何使用此功能:

有一些功能

void convert(char*myBase16String,uint8\u t*outputBase256)

我们假设它接受一个以16为基数编码的字符串,并生成一个无符号字符数组,其中每个字符都是以256为基数的一个单位,我们这样做:

uint8_t base2_8[8];
convert( "0123456789ABCDEF", base2_8 );
uint64_t base2_64[2];
base2_64[0] = (base2_8[0] << 24) | (base2_8[1] << 16) | (base2_8[2] << 8) | base2_8[3];
base2_64[1] = (base2_8[4] << 24) | (base2_8[5] << 16) | (base2_8[6] << 8) | base2_8[7];
// etc. You can do this in a loop, but make sure you know how long it is.
uint8_t base2_8[8];
转换(“0123456789ABCDEF”,base2_8);
uint64基础2基础64[2];

base2_64[0]=(base2_8[0]GMP附带了一个扩展名
stdio.h
,可处理大量数据,请参阅上的手册


标准输入(
gmp\u scanf
)、文件(
gmp\u fscanf
)或已读入内存的字符串(
gmp\u sscanf
)都有常用的风格.

你是用C写的吗?以16为基数的数字和以2^4为基数的数字是一样的。你知道一个以2^64为基数的数字仅仅由16个以2^4为基数的数字组成,对吗?是的,我是用C写的(可能应该提到这一点).无论如何,2^64=16*2^4这一事实有什么帮助?2^64的基数有什么可能的用途?这是蒙哥马利乘法。算法需要处理数字2^w,其中w是一个单词。使用64位计算机。我很欣赏这个解释(实际上很有趣)但是我怎样才能利用mpz_get_str呢?我不知道你正在使用的库的具体情况,但是基本的想法是将你的数字转换为基数2^n,以获得一些n(如果可能的话,8将是好的),然后循环输出,将其作为字节写入内存的某个区域,然后读取该内存。我将在答案中给出一个快速示例。
mpz_get_str
的作用与您的要求相反:它将大数字转换为您选择的任意(小)基中的数字字符串。
uint8_t base2_8[6];
convert( "0123456789AB", base2_8 );
uint64_t base2_64[2];
base2_64[0] =                                           (base2_8[0] << 8) | base2_8[1];
base2_64[1] = (base2_8[2] << 24) | (base2_8[3] << 16) | (base2_8[4] << 8) | base2_8[5];