![](/img/trans.png)
[英]Binary search for multiple distinct numbers in a large array in minimum number of comparisons
[英]Large number in binary
我必须在参数中使用一个80位的整数,将其转换为二进制,然后对其进行一些移位操作。 我使用此代码段(似乎工作正常)来存储参数:
uint64_t n;
seed= strtol(argv[1], &p, 10);
printf("n:%" PRIu64 "\n", n);
然后,我想使用此函数将其转换为二进制:
uint64_t decimal_binary(uint64_t n)
{
uint64_t rem, i=1;
uint64_t binary=0;
while (n!=0)
{
rem=n%2;
n/=2;
binary+=rem*i;
i*=10;
}
return binary;
}
但是之后:
printf("n:%" PRIu64 "\n", n); /* works fine, even for n >= 1048576 */
printf("n:%" PRIu64 "\n", decimal_binary(n)); /* works only for n <= 1048575 */
我将需要使用位移运算符,因此我需要一个可以与<<
一起使用的解决方案。
8个字节的整数不足以存储80位数字的二进制格式。 请考虑使用char数组。
例如,如果数字为3,则其二进制格式为11(2位数字)。 如果数字为255,则二进制数字为11111111(8位数字)。 因此,我认为当数字大于1048575时,必须使用21位以上的数字进行存储。 它大于8个字节的最大值。
您的decimal_binary
可以采用结构包装的uint8_t [10]
数组(如果要省略使用指针进行的某些边界检查)和指向输出缓冲区的指针。 将80位整数作为MSB排列到数组中,然后逐位循环遍历每个字节并写入'0'
或'1'
进行输出,例如
typedef struct { uint8_t arr[10]; } S_big_integer_container;
void decimal_binary( S_big_integer_container bigUInt, char *output[81] )
{
uint32_t i, j;
uint32_t iOut = 0u;
for ( i=0u; i<10u; i++ )
{
for ( j=0u; j<8u; j++)
{
char o = ( bigUInt.arr[i] & (0x80u >> j) ) ? '1' : '0';
(*output)[iOut++] = o;
}
}
(*output)[80] = '\0';
}
现在,您在输出数组中具有80位的二进制字符串,该字符串易于打印。 如果要省略前导零,则需要进行一些修改。 这里的例子
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.