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

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

例如:

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

奖金

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

您不能创建大小小于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; 

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

你可以围绕std::bitsetstd::vector编写一个包装类。 这些是位容器。

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

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

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

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

说明:


您总是可以尝试使用数组使用整数和浮点操作。 如果数字对于数组初始化来说太大,可以使用malloc(); function。

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


如何实施(排序):


 #include  #include  #define MAX_DIGIT_COUNT 1000 int main() { int* big_num = (int*)malloc(sizeof(int) * MAX_DIGIT_COUNT); //allocate memory for(int x; x 

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

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

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