C/C++ 中的任意大小的整数
Arbitrary size integers in C/C++
问题
- 有没有办法使用 c/c++ 创建任意大小的整数?
例如:
int main(void) {
Int i = Int(3); //3-bit integer
i = 1; //Represented as: 001
}
奖金
- 有没有办法对浮动值做同样的事情?
你可以试试 GNU
多精度
Arithmetic Library 库,支持整数、分数和实数。
不,每个原始元素(int、short、long...)的大小取决于硬件架构。
对于更大的尺寸,您应该使用一个大整数库(它们用字符串表示数字)。
您可以围绕 std::bitset
或 std::vector<bool>
编写包装器 class。这些是位容器。
您的 class 将包含其中一个容器并添加与整数之间的转换功能;以及其他算术运算。
这将允许您使用不寻常的位大小的整数,例如 3、5 和 13。
大多数实现会四舍五入到最接近的 8 倍数或处理器的字长。一个 3 位的容器将使用一个 uint8_t
和 5 个未使用的位,主要是因为处理器更容易操作。 13 位整数将驻留在 16 位包中。
编辑 1:浮点数
除非您符合 标准 浮点格式,否则您将不得不编写自己的包装器 class。这将允许您拥有 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);
或使用位域(语法更好,但二进制布局是实现定义的)
struct Date
{
unsigned day : 5;
unsigned month : 4;
unsigned year : 21;
};
Date d;
d.day = 5; d.month = 11; d.year = 2014;
解释:
您总是可以尝试使用数组进行整数和浮点数操作。如果数字对于数组初始化来说太大,可以使用 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 中实现任意大小数字支持的粗略方法。
问题
- 有没有办法使用 c/c++ 创建任意大小的整数?
例如:
int main(void) {
Int i = Int(3); //3-bit integer
i = 1; //Represented as: 001
}
奖金
- 有没有办法对浮动值做同样的事情?
你可以试试 GNU 多精度 Arithmetic Library 库,支持整数、分数和实数。
不,每个原始元素(int、short、long...)的大小取决于硬件架构。
对于更大的尺寸,您应该使用一个大整数库(它们用字符串表示数字)。
您可以围绕 std::bitset
或 std::vector<bool>
编写包装器 class。这些是位容器。
您的 class 将包含其中一个容器并添加与整数之间的转换功能;以及其他算术运算。
这将允许您使用不寻常的位大小的整数,例如 3、5 和 13。
大多数实现会四舍五入到最接近的 8 倍数或处理器的字长。一个 3 位的容器将使用一个 uint8_t
和 5 个未使用的位,主要是因为处理器更容易操作。 13 位整数将驻留在 16 位包中。
编辑 1:浮点数
除非您符合 标准 浮点格式,否则您将不得不编写自己的包装器 class。这将允许您拥有 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);
或使用位域(语法更好,但二进制布局是实现定义的)
struct Date
{
unsigned day : 5;
unsigned month : 4;
unsigned year : 21;
};
Date d;
d.day = 5; d.month = 11; d.year = 2014;
解释:
您总是可以尝试使用数组进行整数和浮点数操作。如果数字对于数组初始化来说太大,可以使用 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 中实现任意大小数字支持的粗略方法。