diff --git a/src/script/script.h b/src/script/script.h --- a/src/script/script.h +++ b/src/script/script.h @@ -339,6 +339,12 @@ return *this; } + inline CScriptNum &operator>>=(const int64_t &rhs) { + assert(rhs >= 0 && rhs < 64 && m_value >= 0); + m_value >>= rhs; + return *this; + } + int getint() const { if (m_value > std::numeric_limits::max()) return std::numeric_limits::max(); diff --git a/src/test/scriptnum_tests.cpp b/src/test/scriptnum_tests.cpp --- a/src/test/scriptnum_tests.cpp +++ b/src/test/scriptnum_tests.cpp @@ -253,4 +253,15 @@ } } +BOOST_AUTO_TEST_CASE(rshift) { + CScriptNum x(45); + x >>= 3; + BOOST_CHECK(x == 5); + BOOST_CHECK((CScriptNum(45) >>= 3) == 5); + BOOST_CHECK((CScriptNum(40) >>= 3) == 5); + BOOST_CHECK((CScriptNum(0x7fffffffffffffffL) >>= 62) == 1); + BOOST_CHECK((CScriptNum(0x7fffffffffffffffL) >>= 63) == 0); + BOOST_CHECK((CScriptNum(42) >>= 0) == 42); +} + BOOST_AUTO_TEST_SUITE_END()