59 for(std::size_t i=0; i<n.size(); i++)
60 if(!(isalnum(n[i]) || (n[i]==
'-' && i==0)))
74 bool neg=a.is_negative();
82 std::size_t len = a.digits(2) + 2;
83 std::vector<char> buffer(len);
84 char *s = a.as_string(buffer.data(), len, 2);
91 fill.resize(width-
result.size(),
'0');
94 else if(
result.size()>width)
99 for(std::size_t i=0; i<
result.size(); i++)
108 unsigned len = n.digits(base) + 2;
109 std::vector<char> buffer(len);
110 char *s = n.as_string(buffer.data(), len, base);
125 if(n.size()<=(
sizeof(
unsigned long)*8))
129 unsigned long mask=1;
130 mask=mask << (n.size()-1);
135 unsigned long other_bits=0;
137 for(std::string::const_iterator it=++n.begin();
149 return top_bit+other_bits;
155 mask=mask << (n.size()-1);
161 for(std::string::const_iterator it=++n.begin();
174 if(n.find_first_not_of(
"01")!=std::string::npos)
184 return BigInt(n.c_str(), 2);
197 PRECONDITION(n>=0 && n<=std::numeric_limits<std::size_t>::max());
200 return (std::size_t) ull;
205 PRECONDITION(n>=0 && n<=std::numeric_limits<unsigned>::max());
208 return (
unsigned)ull;
257 std::size_t true_size)
262 throw "shift value out of range";
266 true_size<(
sizeof(
llong_t)*8) ?
267 (1LL << true_size) - 1 :
278 std::size_t true_size)
284 throw "shift value out of range";
286 const llong_t sign = (1LL << (true_size - 1)) & number;
287 const llong_t pad = (sign == 0) ? 0 : ~((1LL << (true_size - shift)) - 1);
298 std::size_t true_size)
303 throw "shift value out of range";
305 if(true_size<(
sizeof(
llong_t)*8))
308 const llong_t mask = (1LL << true_size) - 1;
324 std::size_t true_size)
329 throw "shift value out of range";
341 std::size_t true_size)
347 throw "shift value out of range";
350 const ullong_t filter = 1ULL << (true_size - 1);
361 std::size_t true_size)
367 throw "shift value out of range";
370 const ullong_t filter = 1ULL << (true_size - 1);
371 ullong_t result=((number<<shift)&filter)|((number&filter) >> revShift);
bool is_signed(const typet &t)
Convenience function – is the type signed?
mp_integer rotate_left(const mp_integer &a, const mp_integer &b, std::size_t true_size)
rotate left (LSB=MSB) bitwise operations only make sense on native objects, hence the largest object ...
const mp_integer string2integer(const std::string &n, unsigned base)
const std::string integer2string(const mp_integer &n, unsigned base)
mp_integer::ullong_t integer2ulong(const mp_integer &n)
mp_integer bitwise_xor(const mp_integer &a, const mp_integer &b)
bitwise xor bitwise operations only make sense on native objects, hence the largest object size shoul...
const mp_integer binary2integer(const std::string &n, bool is_signed)
convert binary string representation to mp_integer
mp_integer arith_left_shift(const mp_integer &a, const mp_integer &b, std::size_t true_size)
arithmetic left shift bitwise operations only make sense on native objects, hence the largest object ...
mp_integer logic_left_shift(const mp_integer &a, const mp_integer &b, std::size_t true_size)
logic left shift bitwise operations only make sense on native objects, hence the largest object size ...
static struct_typet::componentst::iterator pad(struct_typet::componentst &components, struct_typet::componentst::iterator where, std::size_t pad_bits)
mp_integer operator<<(const mp_integer &a, const mp_integer &b)
mp_integer logic_right_shift(const mp_integer &a, const mp_integer &b, std::size_t true_size)
logic right shift (loads 0 on MSB) bitwise operations only make sense on native objects, hence the largest object size should be the largest available c++ integer size (currently long long)
mp_integer bitwise_and(const mp_integer &a, const mp_integer &b)
bitwise and bitwise operations only make sense on native objects, hence the largest object size shoul...
mp_integer arith_right_shift(const mp_integer &a, const mp_integer &b, std::size_t true_size)
arithmetic right shift (loads sign on MSB) bitwise operations only make sense on native objects...
mp_integer bitwise_neg(const mp_integer &a)
bitwise negation bitwise operations only make sense on native objects, hence the largest object size ...
mp_integer operator>>(const mp_integer &a, const mp_integer &b)
#define PRECONDITION(CONDITION)
mp_integer rotate_right(const mp_integer &a, const mp_integer &b, std::size_t true_size)
rotates right (MSB=LSB) bitwise operations only make sense on native objects, hence the largest objec...
mp_integer bitwise_or(const mp_integer &a, const mp_integer &b)
bitwise or bitwise operations only make sense on native objects, hence the largest object size should...
unsigned integer2unsigned(const mp_integer &n)
mstreamt & result() const
BigInt::ullong_t ullong_t
const std::string integer2binary(const mp_integer &n, std::size_t width)
std::size_t integer2size_t(const mp_integer &n)