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 whichrepresents an integral number with the base nBase . |
Public member functions: | |
int Compare(const CLongInt& v) const |
Returns zero if the CLongInt s 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: | |
+, -, *, /, %, <<, >>, &, |, ^, <, <=, ==, !=, >=, > |