00001 #ifndef __SIV_H__
00002 #define __SIV_H__
00003
00004 #include "number.h"
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00017
00025 class siv : public number<__int64>
00026 {
00027 public:
00028
00030
00039 virtual __int64 stringToValue( const char* stringValue )
00040 {
00041 return stringToInt64( stringValue, (char**)0, &bms );
00042 };
00043
00044 public:
00045
00047
00053 siv(const __int64 val)
00054 {
00055 value = val;
00056 bms.status = 0;
00057 bms.undef = 1;
00058 };
00059
00061
00066 siv(const siv& val)
00067 {
00068 value = val.value;
00069 bms.status = val.bms.status;
00070 };
00071
00073
00082 inline void printBitpat( FILE* file=0 ) const
00083 {
00084 char* fmt = "%I64x";
00085 if (file == 0)
00086 {
00087 file = stdout;
00088 }
00089 fprintf( file, fmt, value );
00090 };
00091
00093
00101 inline siv& assignCopy(const double val)
00102 {
00103 if ( val < (double)LLONG_MIN )
00104 {
00105
00106 value = LLONG_MIN;
00107 bms.overflow = 1;
00108 bms.negative = 1;
00109 return *this;
00110 }
00111 if ( val < 0.0 )
00112 {
00113 value = (__int64)(val - 0.5);
00114 return *this;
00115 }
00116 if ( val <= (double)LLONG_MAX )
00117 {
00118 value = (__int64)(val + 0.5);
00119 return *this;
00120 }
00121
00122 value = LLONG_MAX;
00123 bms.overflow = 1;
00124 return *this;
00125 };
00126
00128
00140 inline siv& assignCopy(const char* strVal)
00141 {
00142 if (strVal == NULL)
00143 {
00144 bms.strErr = 1;
00145 return *this;
00146 }
00147 size_t sLen = strlen( strVal );
00148 size_t idx = 0;
00149 for ( idx = 0; idx < sLen; idx++ )
00150 {
00151 if ( ('0' <= strVal[idx]) && (strVal[idx] <= '9') )
00152 {
00153 break;
00154 }
00155 if ( strVal[idx] == '\r' )
00156 {
00157 continue;
00158 }
00159 if ( strVal[idx] == '\n' )
00160 {
00161 continue;
00162 }
00163 if ( strVal[idx] == '\t' )
00164 {
00165 continue;
00166 }
00167 if ( strVal[idx] == ' ' )
00168 {
00169 continue;
00170 }
00171 if ( strVal[idx] == '+' )
00172 {
00173 continue;
00174 }
00175 if ( strVal[idx] == '-' )
00176 {
00177 continue;
00178 }
00179
00180 bms.strErr = 1;
00181 return *this;
00182 }
00183
00184
00185 if ( idx > 0 )
00186 {
00187 if ( (strVal[idx-1] == '+') || (strVal[idx-1] == '-') )
00188 {
00189 idx--;
00190 }
00191 }
00192 value = _atoi64( &strVal[idx] );
00193 bms.status = 0;
00194 return *this;
00195 };
00196
00198
00206 inline siv& operator = (const double val)
00207 {
00208 return assignCopy( val );
00209 };
00210
00212
00214
00216
00224 inline siv operator + (const __int64 addend) const
00225 {
00226 siv res(*this);
00227 res.assignAdd( addend );
00228 return res;
00229 };
00230
00232
00240 inline siv operator + (const siv& addend) const
00241 {
00242 siv res(*this);
00243 res.assignAdd( addend );
00244 return res;
00245 };
00246
00248
00256 inline siv operator - (const __int64& subtrahend) const
00257 {
00258 siv res(*this);
00259 res.assignSub( subtrahend );
00260 return res;
00261 };
00262
00264
00272 inline siv operator - (const siv& subtrahend) const
00273 {
00274 siv res(*this);
00275 res.assignSub( subtrahend );
00276 return res;
00277 };
00278
00280
00288 inline siv operator * (const __int64 multiplicand) const
00289 {
00290 siv res(*this);
00291 res.assignMul( multiplicand );
00292 return res;
00293 };
00294
00296
00304 inline siv operator * (const siv& multiplicand) const
00305 {
00306 siv res(*this);
00307 res.assignMul( multiplicand );
00308 return res;
00309 };
00310
00312
00317 inline siv& assignReciproc()
00318 {
00319 if ((-2 <= value) && (value < 0))
00320 {
00321 value = -1;
00322 return *this;
00323 }
00324 if ((0 < value) && (value <= 2))
00325 {
00326 value = 1;
00327 return *this;
00328 }
00329 value = 0;
00330 return *this;
00331 };
00332
00334
00340 inline siv reciproc() const
00341 {
00342 siv res( *this );
00343 res.assignReciproc();
00344 return res;
00345 };
00346
00348
00355 inline siv operator / (const __int64 denominator) const
00356 {
00357 siv res(*this);
00358 res.assignDiv( denominator );
00359 return res;
00360 };
00361
00363
00370 inline siv operator / (const siv& denominator) const
00371 {
00372 siv res(*this);
00373 res.assignDiv( denominator );
00374 return res;
00375 };
00376
00378
00385 inline siv operator % (const __int64 denominator) const
00386 {
00387 siv remainder(*this);
00388 remainder.assignMod( denominator );
00389 return remainder;
00390 }
00391
00393
00400 inline siv operator % (const siv& denominator) const
00401 {
00402 siv remainder(*this);
00403 remainder.assignMod( denominator );
00404 return remainder;
00405 }
00406
00408
00416 inline siv positive() const
00417 {
00418 siv absVal( *this );
00419 absVal.assignPositive();
00420 return absVal;
00421 };
00422
00424
00432 inline siv negative() const
00433 {
00434 siv negVal( *this );
00435 negVal.assignNegative();
00436 return negVal;
00437 };
00438
00440
00457 inline siv absMin( const siv& val ) const
00458 {
00459
00460 if ( positive() <= val.positive() )
00461 {
00462 return *this;
00463 }
00464 return val;
00465 };
00466
00468
00476 inline siv invertSign() const
00477 {
00478 siv invVal( *this );
00479 invVal.assignInvertSign();
00480 return invVal;
00481 };
00482
00484
00486
00488
00496 inline siv pow(const int exp)
00497 {
00498 siv res( *this );
00499 res.assignPow( exp );
00500 return res;
00501 };
00502
00504
00516 inline siv sqrt() const
00517 {
00518 siv res( *this );
00519 res.assignSqrt();
00520 return res;
00521 };
00522
00524
00526
00528
00541 inline siv& assignAnd(const __int64 val)
00542 {
00543 value &= val;
00544 return *this;
00545 };
00546
00548
00560 inline siv& operator &= (const __int64 val)
00561 {
00562 return assignAnd( val );
00563 };
00564
00566
00578 inline siv and(const __int64 val) const
00579 {
00580 siv res( *this );
00581 res.assignAnd( val );
00582 return res;
00583 };
00584
00586
00599 inline siv operator & (const __int64 val) const
00600 {
00601 return and( val );
00602 };
00603
00605
00618 inline siv& assignOr(const __int64 val)
00619 {
00620 value |= val;
00621 return *this;
00622 };
00623
00625
00637 inline siv& operator |= (const __int64 val)
00638 {
00639 return assignOr( val );
00640 };
00641
00643
00655 inline siv or(const __int64 val) const
00656 {
00657 siv res( *this );
00658 res.assignOr( val );
00659 return res;
00660 };
00661
00663
00675 inline siv operator | (const __int64 val) const
00676 {
00677 return or( val );
00678 };
00679
00681
00694 inline siv& assignBitwiseNot()
00695 {
00696 value = ~value;
00697 return *this;
00698 };
00699
00701
00713 inline siv bitwiseNot()
00714 {
00715 siv res( ~value );
00716 return res;
00717 };
00718
00720
00732 inline siv& operator ~ ()
00733 {
00734 return assignBitwiseNot();
00735 };
00736
00738
00751 inline siv& assignXor(const __int64 val)
00752 {
00753 value ^= val;
00754 return *this;
00755 };
00756
00758
00770 inline siv& operator ^= (const __int64 val)
00771 {
00772 return assignXor( val );
00773 };
00774
00776
00788 inline siv xor(const __int64 val) const
00789 {
00790 siv res( *this );
00791 res.assignXor( val );
00792 return res;
00793 };
00794
00796
00808 inline siv operator ^ (const __int64 val) const
00809 {
00810 return xor( val );
00811 };
00812
00814
00827 inline siv& assignShiftLeft(const int cnt)
00828 {
00829 value <<= cnt;
00830 return *this;
00831 };
00832
00834
00847 inline siv& operator <<= (const int cnt)
00848 {
00849 return assignShiftLeft( cnt );
00850 };
00851
00853
00866 inline siv shiftLeft(const int cnt) const
00867 {
00868 siv res( *this );
00869 res.assignShiftLeft( cnt );
00870 return res;
00871 };
00872
00874
00887 inline siv operator << (const int cnt)
00888 {
00889 return shiftLeft( cnt );
00890 };
00891
00893
00906 inline siv& assignShiftRight(const int cnt)
00907 {
00908 value >>= cnt;
00909 return *this;
00910 };
00911
00913
00926 inline siv& operator >>= (const int cnt)
00927 {
00928 return assignShiftRight( cnt );
00929 };
00930
00932
00945 inline siv shiftRight(const int cnt) const
00946 {
00947 siv res( *this );
00948 res.assignShiftRight( cnt );
00949 return res;
00950 };
00951
00953
00966 inline siv operator >> (const int cnt)
00967 {
00968 return shiftRight( cnt );
00969 };
00970
00972
00985 inline siv& assignRotLeft(const int cnt)
00986 {
00987 if ( cnt < 0 )
00988 {
00989 return assignRotRight( -cnt );
00990 }
00991 __int64 hiBit;
00992 for ( int bitPos = 0; bitPos < cnt; bitPos++ )
00993 {
00994 hiBit = value & 0x8000000000000000L;
00995 value <<= 1;
00996 if (hiBit != 0L)
00997 {
00998 value |= 1L;
00999 }
01000 }
01001 return *this;
01002 };
01003
01005
01018 inline siv rotLeft(const int cnt) const
01019 {
01020 siv res( *this );
01021 res.assignRotLeft( cnt );
01022 return res;
01023 };
01024
01026
01039 inline siv& assignRotRight(const int cnt)
01040 {
01041 if ( cnt < 0 )
01042 {
01043 return assignRotLeft( -cnt );
01044 }
01045 __int64 loBit;
01046 for ( int bitPos = 0; bitPos < cnt; bitPos++ )
01047 {
01048 loBit = value & 1L;
01049 value >>= 1;
01050 if (loBit != 0L)
01051 {
01052 value |= 0x8000000000000000L;
01053 }
01054 }
01055 return *this;
01056 };
01057
01059
01072 inline siv rotRight(const int cnt) const
01073 {
01074 siv res( *this );
01075 res.assignRotRight( cnt );
01076 return res;
01077 };
01078
01079 };
01080
01081 #endif //__SIV_H__