| 263 | } |
| 264 | |
| 265 | inline uint64_t get_bits(uint64_t pos, uint64_t len) const { |
| 266 | assert(pos + len <= size()); |
| 267 | if (!len) { |
| 268 | return 0; |
| 269 | } |
| 270 | uint64_t block = pos / 64; |
| 271 | uint64_t shift = pos % 64; |
| 272 | uint64_t mask = -(len == 64) | ((1ULL << len) - 1); |
| 273 | if (shift + len <= 64) { |
| 274 | return m_bits[block] >> shift & mask; |
| 275 | } else { |
| 276 | return (m_bits[block] >> shift) | (m_bits[block + 1] << (64 - shift) & mask); |
| 277 | } |
| 278 | } |
| 279 | |
| 280 | // same as get_bits(pos, 64) but it can extend further size(), padding with zeros |
| 281 | inline uint64_t get_word(uint64_t pos) const |