From 5a2d18587b53133bc831967ccd8d6a5dd6e54190 Mon Sep 17 00:00:00 2001 From: Olivier Gayot Date: Sun, 19 Nov 2017 11:51:41 +0100 Subject: Added the left-shift computation Signed-off-by: Olivier Gayot --- number.cpp | 35 +++++++++++++++++++++++++++++++++++ number.h | 15 +++++++++++++++ 2 files changed, 50 insertions(+) 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 {{{ */ @@ -173,6 +200,14 @@ number::operator+=(const number &n) return *this; } +number & +number::operator<<=(std::uint32_t n) +{ + *this = *this << n; + + return *this; +} + number & number::operator++() { diff --git a/number.h b/number.h index d93ed70..16fcea6 100644 --- a/number.h +++ b/number.h @@ -48,6 +48,14 @@ public: */ number operator*(const number &) const; + /** + * \brief Return a number equals to this number where n bits have been + * shifted to the left. + * + * \param n Number of bits to shift. + */ + number operator<<(std::uint32_t n) const; + /** * \brief Tells whether the number passed as parameter is strictly less * than this number. @@ -103,6 +111,13 @@ public: */ number &operator+=(const number &n); + /** + * \brief Shift the number n bits to the left. + * + * \param n Number of bits to shift. + */ + number &operator<<=(std::uint32_t); + /** * \brief Increment this number. */ -- cgit v1.2.3