From 09f8d4a4b20f234dafcdf2ce667f220801b9210f Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 19 Aug 2018 01:42:30 +0200 Subject: Make size of bit vectors precise --- chilbert/FixBitVec.hpp | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) (limited to 'chilbert/FixBitVec.hpp') diff --git a/chilbert/FixBitVec.hpp b/chilbert/FixBitVec.hpp index 0dab483..f9ce94a 100644 --- a/chilbert/FixBitVec.hpp +++ b/chilbert/FixBitVec.hpp @@ -79,25 +79,27 @@ public: Rack m_mask; }; - CFixBitVec(const size_t bits = bits_per_rack) + explicit CFixBitVec(const size_t bits) : m_rack{0} + , m_size{bits} { assert(bits <= bits_per_rack); } CFixBitVec(const size_t bits, const Rack value) : m_rack{value} + , m_size{bits} { assert(bits <= bits_per_rack); } /// Return the size in bits - size_t size() const { return bits_per_rack; } + size_t size() const { return m_size; } /// Set all bits to one CFixBitVec& set() { - m_rack = FBV1S; + m_rack = FBV1S & FBVN1S(size()); return *this; } @@ -255,32 +257,26 @@ public: return t; } - /// Right-rotate the least significant `width` bits by `bits` positions - CFixBitVec& rotr(const size_t bits, const size_t width) + /// Right-rotate by `bits` positions + CFixBitVec& rotr(const size_t bits) { if (bits) { - assert(width > 0); - assert(bits < width); - assert(bits < bits_per_rack); - assert((width - bits) < bits_per_rack); - m_rack &= FBVN1S(width); - m_rack = (m_rack >> bits) | (m_rack << (width - bits)); - m_rack &= FBVN1S(width); + assert(bits <= bits_per_rack); + m_rack &= FBVN1S(size()); + m_rack = (m_rack >> bits) | (m_rack << (size() - bits)); + m_rack &= FBVN1S(size()); } return *this; } - /// Left-rotate the least significant `width` bits by `bits` positions - CFixBitVec& rotl(const size_t bits, const size_t width) + /// Left-rotate by `bits` positions + CFixBitVec& rotl(const size_t bits) { if (bits > 0) { - assert(width > 0); - assert(bits < width); - assert(bits < bits_per_rack); - assert((width - bits) < bits_per_rack); - m_rack &= FBVN1S(width); - m_rack = (m_rack << bits) | (m_rack >> (width - bits)); - m_rack &= FBVN1S(width); + assert(bits <= bits_per_rack); + m_rack &= FBVN1S(size()); + m_rack = (m_rack << bits) | (m_rack >> (size() - bits)); + m_rack &= FBVN1S(size()); } return *this; } @@ -401,7 +397,8 @@ private: static_assert(8 * sizeof(Rack) == bits_per_rack, ""); static_assert((sizeof(Rack) == 4) || (sizeof(Rack) == 8), ""); - Rack m_rack{}; + Rack m_rack{}; + size_t m_size{}; }; template <> -- cgit v1.2.1