我在使用C ++中的大整数类算法时遇到了问题。我最初的想法是使用数组/列表,但效率非常低。然后我发现了类似下面的类: http://www.codeproject.com/KB/cpp/CppIntegerClass.aspx
然而,我发现这种方法确实令人困惑。我不知道如何使用位操作,我几乎不了解代码。有人请向我解释如何利用位操作,它是如何工作的等等。最终我想创建自己的大整数类,但我只是一个新手程序员而且我刚学会了如何使用类。
基本上我的问题是: 如何使用位操作来创建一个大整数类?它是如何工作的?
谢谢!
答案 0 :(得分:1)
首先阅读binary numbers。该页面显示了常用的算术运算(加法,减法等)如何对二进制数进行处理,即如何逐位处理数字以获得所需的结果。
一旦你知道为什么正在使用位操作操作,那么将它映射到编程语言(如C ++)应该非常简单。
根据我的经验,在实现类似这样的东西时,最明显的面向位的东西是位 testing ,以检查溢出。假设您将大二进制数表示为uint16_t
的数组,即16位的块。实现添加时,您将从两个数字的最不重要的一端开始,并添加它们。如果总和大于65,535,则需要“携带”一个到下一个uint16_t
,就像一次添加十进制数字一样。
这可以通过如下测试来实现:
const uint16_t *number1;
const uint16_t *number2;
/* assume code goes here to set up the number1 and number2 pointers. */
/* Compute sum of 16 bits. */
uint16_t carry = 0;
uint32_t sum = number1[0] + number2[0];
/* One way of testing for overflow: */
if (sum & (1 << 16))
carry = 1;
这里,1 << 16
表达式通过向左移动1个16步来创建掩码。 &
按位和运算符测试掩码的总和;如果在sum
中设置了位16,则结果将为非零(即,在C ++中为真)。