大整数类的位操作?

时间:2010-12-13 13:01:38

标签: c++ bit-manipulation biginteger

我在使用C ++中的大整数类算法时遇到了问题。我最初的想法是使用数组/列表,但效率非常低。然后我发现了类似下面的类: http://www.codeproject.com/KB/cpp/CppIntegerClass.aspx

然而,我发现这种方法确实令人困惑。我不知道如何使用位操作,我几乎不了解代码。有人请向我解释如何利用位操作,它是如何工作的等等。最终我想创建自己的大整数类,但我只是一个新手程序员而且我刚学会了如何使用类。

基本上我的问题是: 如何使用位操作来创建一个大整数类?它是如何工作的?

谢谢!

1 个答案:

答案 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 ++中为真)。