For the signed case, the shifts already remove the rest of the value, so ANDing by the mask is redundant.
@@ -160,7 +160,7 @@ public:
if (std::numeric_limits<T>::is_signed)
{
std::size_t shift = 8 * sizeof(T)-bits;
- return (T)(((storage & GetMask()) << (shift - position)) >> shift);
+ return (T)((storage << (shift - position)) >> shift);
}
else