summaryrefslogtreecommitdiff
path: root/number.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'number.cpp')
-rw-r--r--number.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/number.cpp b/number.cpp
index d16f37f..497cf64 100644
--- a/number.cpp
+++ b/number.cpp
@@ -106,6 +106,33 @@ number::operator*(const number &n) const
return result;
}
+number
+number::operator<<(std::uint32_t shift) const
+{
+ if (shift > 32) {
+ /* TODO */
+ throw std::out_of_range("> 32");
+ }
+
+ number result(*this);
+
+ std::uint32_t carry = 0;
+
+ for (auto &operand: result._operands) {
+ std::uint32_t tmp = ((1ull * operand) << shift) + carry;
+
+ carry = ((1ull * operand) >> (32 - shift));
+
+ operand = tmp;
+ }
+
+ if (carry) {
+ result._operands.push_back(carry);
+ }
+
+ return result;
+}
+
/* }}} */
/* Comparison operators {{{ */
@@ -174,6 +201,14 @@ number::operator+=(const number &n)
}
number &
+number::operator<<=(std::uint32_t n)
+{
+ *this = *this << n;
+
+ return *this;
+}
+
+number &
number::operator++()
{
*this = *this + 1;