Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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/C+中任意大小的整数+; 问题: 有没有一种方法可以使用c/c++创建任意大小的整数_C++_C_Integer - Fatal编程技术网

C/C+中任意大小的整数+; 问题: 有没有一种方法可以使用c/c++创建任意大小的整数

C/C+中任意大小的整数+; 问题: 有没有一种方法可以使用c/c++创建任意大小的整数,c++,c,integer,C++,C,Integer,例如: int main(void) { Int i = Int(3); //3-bit integer i = 1; //Represented as: 001 } 奖金 有没有一种方法可以对浮点值执行相同的操作 您可以尝试该库,它支持整数、分数和实数。否,每个基本元素(int、short、long…)的大小取决于硬件体系结构 对于较大的大小,您应该使用一个大整数库(它们用字符串表示数字)。您可以围绕std::bitset或std::vector编写包装类。这些是位容器 您的类将

例如:

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

奖金
  • 有没有一种方法可以对浮点值执行相同的操作

您可以尝试该库,它支持整数、分数和实数。

否,每个基本元素(int、short、long…)的大小取决于硬件体系结构


对于较大的大小,您应该使用一个大整数库(它们用字符串表示数字)。

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

您的类将包含一个容器,并添加与整数之间的转换功能;以及其他算术运算

这将允许您使用不寻常的位大小的整数,例如3、5和13

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

编辑1:浮点数

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

不能创建小于
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);
说明:
您可以尝试使用数组进行整数和浮点操作。如果该数字对于数组初始化来说太大,则可以使用
malloc()函数

请注意:此方法不是很快,因为我们将在堆中分配内存。您还必须编写自己的数学运算函数,因为我不太确定如何有效地实现它。 详见下文


如何实施(排序):
#包括
#包括
#定义最大数字计数1000
int main()
{
int*big_num=(int*)malloc(sizeof(int)*MAX_DIGIT_COUNT);//分配内存


对于(int x;xy),您可以编写一个这样做的类。不是单独编写,而是作为结构或类的一部分编写:如果您试图在任意大小的浮点类中执行
1/3
,则可能会出现堆栈溢出!请查看此处的任意大小的小整数:,这是如果您对节省内存感兴趣的话(钻头填料的性能损失很小)。对于比标准类型更大的类型,您可能最好使用一些库。这篇文章太宽泛了:关于可变位长度、可变字节长度和其他各种浮点的问题。请尝试这三种类型中的一种,并明确说明获得高质量答案所需的符号数。您能详细说明您的意思吗“字符串”?例如:“94314”。字符串可以有一个任意大小,因此您可以有更大的数字。问题是重新定义算术运算。@为什么不用一定大小的整数数组表示任意整数?这将比文本字符串快得多。“不,每个基本元素的大小(int、short、long…)取决于硬件架构。“Hmmm-在相同的硬件平台上,我可以使用各种编译器和选项设置,并可以控制
char
(有符号或无符号)、
int
(16或32)、
long
(32或64位)的范围.我想说编译器有最终的控制权,而不是硬件。我能用gmp创建一个固定大小的整数吗?就我所读的内容而言,这会创建类似python的整数,只要它们有所需的内存就可以增长。@SimonOroño:至少对于浮点支持,看起来您指定了要使用的位数:答案是缺少的“小于一个字节”特性。@SimonOroño啊哈;我不知道子字节大小对你很重要。@SimonOroño如果你想要固定宽度的整数/浮点类型,那么你应该使用或者请详细说明“二进制布局是实现定义的”“?@SimonOroño-不能保证不同的编译器会产生相同的布局。标准让与异域平台兼容的“非标准化”早已过时。如果你想要可移植性,最好自己编写“手动位域”正如我在上面的评论中链接的问题中所描述的那样。环绕
位集
向量
将是不必要的缓慢和复杂。位集甚至不支持动态大小,必须在编译时知道。自定义位大小的变量将是不必要的缓慢和复杂,因为位集、清除、提取和打包。
位集
向量
都是方便的容器。根据需要,您可以使用比基于单个位的容器效率更高的容器。为什么位容器速度较慢?什么效率更高?@ddriver讽刺的是,在64位整数操作的现代硬件操作上通常只需要一个时钟周期,而位访问只需要2-3个周期,并且您仍然需要执行实际操作。计算机至少可以寻址一个字节,因此在字节下面执行操作总是会产生提取值所需的位操作开销。顺便提一下,您可以使用
字符数组
来提高内存效率效率。。。
struct Date
{
    unsigned day : 5;
    unsigned month : 4;
    unsigned year : 21; 
};

Date d;
d.day = 5; d.month = 11; d.year = 2014;
#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;
}