C / C ++中的任意大小整数

时间:2015-02-23 23:48:20

标签: c++ c integer

问题

  • 有没有办法用c / c ++创建一个任意大小的整数?

例如:

int main(void) {
  Int i = Int(3); //3-bit integer
  i = 1; //Represented as: 001
}

加成

  • 有没有办法对浮动值做同样的事情?

5 个答案:

答案 0 :(得分:6)

您不能创建大小小于char的整数(也就是说,每个对象的字节大小是sizeof(char)的倍数,即1)。但这不是问题,因为你可以在更大的数字内打包数字。

const unsigned size_in_bits = 3;
unsigned a = 1; // 001
unsigned b = 5; // 101
unsigned packed = (b << size_in_bits*1) | (a << size_in_bits*0); // 101001
unsigned unpacked_a = (packed >> size_in_bits*0) & ((1 << size_in_bits)-1);
unsigned unpacked_b = (packed >> size_in_bits*1) & ((1 << size_in_bits)-1);

或使用位域(语法更好,但二进制布局是实现定义的)

struct Date
{
    unsigned day : 5;
    unsigned month : 4;
    unsigned year : 21; 
};

Date d;
d.day = 5; d.month = 11; d.year = 2014;

答案 1 :(得分:3)

您可以尝试GNU Multiple Precision Arithmetic Library库,它支持整数,分数和实数。

答案 2 :(得分:2)

您可以围绕std::bitsetstd::vector<bool>编写包装类。这些是位容器。

您的类将包含其中一个容器,并添加转换为整数和从整数转换的功能;以及其他算术运算。

这将允许您具有不寻常的位大小整数,例如3,5和13.

大多数实现将向上舍入到最接近的8的倍数或处理器的字大小。一个3位的容器将使用uint8_t和5个未使用的位,主要是因为处理器更容易操作。 13位整数将驻留在16位包中。

编辑1:浮点数
除非您符合标准浮点格式,否则您必须编写自己的包装类。这将允许你有3位尾数,5位指数和1位符号 - 9位。再次,考虑一下您需要编写的所有方法。大多数应用程序将使用doublefloat,因为不需要编写单独的包装器,这需要编码时间和测试时间。

答案 3 :(得分:1)

说明:

您总是可以尝试使用数组使用整数和浮点操作。如果数字太大而无法进行数组初始化,则可以使用malloc();函数。

请注意:这个方法不是很快,因为我们将在堆中分配内存。您还必须编写自己的数学运算函数,因为我不太清楚如何有效地实现它。 查看更多信息

如何实施(排序):

#include <stdio.h>
#include <stdlib.h>

#define MAX_DIGIT_COUNT 1000

int main()
{
    int* big_num = (int*)malloc(sizeof(int) * MAX_DIGIT_COUNT); //allocate memory
    for(int x; x<MAX_DIGIT_COUNT; x++)
    {
        /*
        *Iterating through number - iterating works, because we are basing out max number lenght 
        *off of the maximum digits, and therefore, we can have a maximum of 2^64 digits
        */
        big_num[x] = rand()%5; //fill up memory block with psuedo-random numbers
    }
    /*Printing begins here...*/
    for(int i; i<MAX_DIGIT_COUNT; i++)
    {
        int iterated;
        iterated = big_num[i];
        printf("%d", iterated);
    }
    printf("\n");
    /*Printing ends here*/
    return 0;
}

请注意:这只是在纯C中实现任意大小的数字支持的粗略方式。

答案 4 :(得分:-2)

不,每个原始元素(int,short,long ......)的大小都取决于硬件架构。

对于更大的尺寸,您应该使用一个Big Integer库(它们代表带字符串的数字)。