38#define __USE_LONG_LONG__
43#ifdef __INTEL_COMPILER
44#define __USE_LONG_LONG__
50#define __USE_LONG_LONG__
56#ifdef _INTEGRAL_MAX_BITS
57#if (_INTEGRAL_MAX_BITS >= 64)
58#define __USE_LONG_LONG__
67#define __USE_LONG_LONG__
70#ifdef __USE_LONG_LONG__
74#define NOTZERO ~(0ULL)
76typedef long long longint;
82#define NOTZERO longint (~0,~0)
83#define NOTONE longint (~0,~1)
90 longint(
unsigned int low)
96 longint(
unsigned int high,
unsigned int low)
102 longint(
const longint & source)
114 return lo != 0 || hi != 0;
119 return longint(~hi, ~lo);
122 longint operator ^(
const longint & rhs)
124 return longint(hi ^ rhs.hi, lo ^ rhs.lo);
127 longint operator & (
const longint & rhs)
129 return longint(hi & rhs.hi, lo & rhs.lo);
132 longint operator | (
const longint & rhs)
134 return longint(hi | rhs.hi, lo | rhs.lo);
137 bool operator != (
const longint & rhs)
139 return lo != rhs.lo || hi != rhs.hi;
142 bool operator != (
unsigned int rhs)
144 return lo != rhs || hi != 0;
147 bool operator != (
int rhs)
149 return lo != (
unsigned int) rhs || hi != 0;
152 bool operator == (
const longint & rhs)
const
154 return lo == rhs.lo && hi == rhs.hi;
157 bool operator == (
const unsigned int rhs)
const
159 return lo == rhs && hi == 0;
162 bool operator == (
const int rhs)
const
164 return lo == (
unsigned int) rhs && hi == 0;
167 longint & operator = (
const longint & rhs)
174 longint & operator = (
unsigned int rhs)
181 longint & operator = (
int rhs)
188 longint & operator ^= (
const longint & rhs)
195 longint & operator |= (
const longint & rhs)
202 longint operator &= (
const longint & rhs)
211 longint result(*
this);
216 longint & operator <<= (
int bits)
222 hi = (hi << 1) + ((lo & 0x80000000) != 0);
224 return *
this <<= bits - 1;
230 longint result(*
this);
235 longint & operator >>= (
int bits)
241 lo = (lo >> 1) + (hi & 1 ? 0x80000000 : 0);
243 return *
this >>= bits - 1;
247 longint operator - (
unsigned int rhs)
249 int high = (rhs > lo) ? hi - 1 : hi;
250 return longint(high, lo - rhs);
253 longint operator - (
int rhs)
255 int high = ((
unsigned int) rhs > lo) ? hi - 1 : hi;
256 return longint(high, lo - rhs);