diff --git a/core/bitops.h b/core/bitops.h
index eaff2c6..a4c34d0 100644
--- a/core/bitops.h
+++ b/core/bitops.h
@@ -60,12 +60,12 @@ along with this program. If not, see .
template
inline T extract_bits(T val, int pos, int len) {
- return (val >> pos) & (((T)1 << len) - 1);
+ return (val >> pos) & ((len == sizeof(T) * 8) ? (T)-1 : ((T)1 << len) - 1);
}
template
inline void insert_bits(T &old_val, T new_val, int pos, int len) {
- T mask = (((T)1 << len) - 1) << pos;
+ T mask = ((len == sizeof(T) * 8) ? (T)-1 : ((T)1 << len) - 1) << pos;
old_val = (old_val & ~mask) | ((new_val << pos) & mask);
}