MFC Template Class CLongInt
The template class template <UINT bits, class T = USHORT, class LT = ULONG> class CLongInt<bits> supports long integer arithmetic. Internally, a CLongInt is represented by n digits of the integral type T (specified by the second template parameter). T must be unsigned. The first digit is the most significant digit, the last digit is the least significant digit. The number base of the internal representation of a CLongInt is 2sizeof(T)*CHAR_BIT. For example, if T is an unsigned short, the number base of the CLongInt is 65536. For internal calculations, there must also exist an unsigned integral type LT (specified by the third template parameter) which must have double the size as T. To achieve maximum portability to other C++ compilers, I've chosen unsigned short for T and unsigned long for LT.
The template parameter bits specifies the size of a CLongInt in bits. bits should be at least 64+sizeof(T)*CHAR_BIT. For smaller bit numbers, use any of the built-in simple types int, long, or __int64.
The CLongInt class implements the complete integer arithmetic. There are friend operator functions to mix CLongInt operands with int or long operands. You can easily expand the class CLongInt to mix it with __int64 operands, too.
To prevent the specification of an invalid template parameter for T or LT, the technique of compile-time assertions is applied (see header file StaticCheck.h). This technique is presented by Andrei Alexandrescu in his book Modern C++ Design (see Chapter 2.1).
CLongInt class members:
| Constructors: | |
|---|---|
CLongInt() |
Constructs an uninitialized CLongInt. |
CLongInt(const CLongInt& u) |
Constructs a CLongInt from another CLongInt u. |
CLongInt(int u) |
Constructs a CLongInt from an integral number u. |
CLongInt(LPCTSTR psz, UINT nBase=10) |
Constructs a CLongInt from the string psz which
represents an integral number with the base nBase. |
| Public member functions: | |
int Compare(const CLongInt& v) const |
Returns zero if the CLongInts are identical, <0 if this CLongInt is less than v, or >0 if this CLongInt is greater than v. |
CLongInt Divide(CLongInt v, CLongInt* pRem = 0, bool bSigned = true) const |
Divides this CLongInt by v. The quotient will be returned. The remainder will be stored in *pRem if pRem is unequal zero. If bSigned is false, the division will be performed unsigned. |
int ToInt() const |
Converts this CLongInt to an integral quantity of type int, unsigned int, long, or unsigned long. |
CString ToString(UINT nBase = 10) const |
Converts this CLongInt to a string representing the number with base nBase. |
| Cast operator functions: | |
LPCVOID |
Gives access to the internal digit buffer (e.g. for copying directly from memory to a CLongInt or vice versa). |
| Assignment operator functions: | |
=, +=, -=, *=, /=, %=, <<=, >>=, &=, |=, ^= | |
| Unary operator functions: | |
+, -, ++ (pre- and postincrement), -- (pre- and postdecrement), !, ~ | |
| Binary operator functions: | |
+, -, *, /, %, <<, >>, &, |, ^, <, <=, ==, !=, >=, > | |

Comments
Expanding the basic types T and T2 to UINT32 and UINT64; Fast Modulus
Posted by Legacy on 03/18/2003 12:00amOriginally posted by: Anton
ReplyBug in ToString()?
Posted by Legacy on 03/15/2003 12:00amOriginally posted by: Pawel Guzowski
Why do I always get "0077042C" as the result when I do ToString(base), whatever the actual number, whatever the size, whatever the base? (maybe it's bug in my compiler, dont know, but using MSVC++).
Cheers.
ReplyThis a good work! But performance is very limit
Posted by Legacy on 01/15/2003 12:00amOriginally posted by: Solomon Wu
This a good work! But performance isn't very good.
ReplyFor CLongInt<T> a , when T>1000000, performance speedy change to bad
Excellent. "Scientific Expression"?
Posted by Legacy on 10/14/2002 12:00amOriginally posted by: X Tan
Thank you very much for your excellent work, Mr Thomas Holte.
If the numbers could automatically expressed as scientific expression (e.g. 4e-32, 1.35e40) when the numbers are too large to appear in the fix room, it will be perfect.
Could you please provide with some clues to do that, Thomas. Or anyone know how to do it?
ReplyBeautiful
Posted by Legacy on 10/06/2002 12:00amOriginally posted by: Bappi
ReplyNice work!!
Posted by Legacy on 09/13/2002 12:00amOriginally posted by: Gilbert
Thank you very much.
It's so nice and useful thing.
Reply
great work, thanks!
Posted by Legacy on 08/20/2002 12:00amOriginally posted by: Stefan Ganscha
as per subject
Reply
Good work, but there's a better implementation.
Posted by Legacy on 03/21/2002 12:00amOriginally posted by: Gabriel Praino
Good code!!! but there's a problem with this implementation.
In many applications, it's very common to work with very different integer sizes.
A situation where long integers are very used are encryption algorithms. Allmost all public key algorithms used to sign and encrypt information all over the world are based on long integers, which may have 1024 or more bits.
In this kind of applications, it's very common to work with integer of 512, 768, 1024 and 2048 bits.
In some situations, you require even more bits to perform some kind of operations.
If you use the maximun bit size allways, you'll get a very poor performance (encryption requires extremely fast algorithms), but compiling the code with many different integer sizes would result in an inneficient code also. If we also consider converting from a bit size to another this would becomes a caos.
I once had to programm a class to do this, and I rather prefer to use a code which dinamically allocates memory and can handle any bit size.
Of course, allocating memory has a cost, but in many application this is preferred.
ReplyBug in function Divide. Here's the fix...
Posted by Legacy on 03/11/2002 12:00amOriginally posted by: Serge Debner
ReplyMin and max
Posted by Legacy on 03/11/2002 12:00amOriginally posted by: Per Nilsson
ReplyLoading, Please Wait ...