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 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'number.cpp') 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++() { -- cgit v1.2.3