78 std::uint32_t
read_bits(std::size_t num_bits)
noexcept {
79 if (num_bits == 0 || num_bits > 32) [[unlikely]] {
83 if (bit_pos_ + num_bits > num_bits_) [[unlikely]] {
88 if ((bit_pos_ & 7) == 0 && (num_bits & 7) == 0) [[likely]] {
89 std::size_t byte_idx = bit_pos_ >> 3;
90 std::size_t num_bytes = num_bits >> 3;
91 std::uint32_t value = 0;
92 for (std::size_t i = 0; i < num_bytes; ++i) {
93 value = (value << 8) | data_[byte_idx + i];
100 std::uint32_t value = 0;
104 std::size_t byte_idx = bit_pos_ >> 3;
105 std::size_t bit_idx = bit_pos_ & 7;
108 std::size_t bits_in_byte = 8 - bit_idx;
112 std::uint8_t byte_val = data_[byte_idx];
113 std::uint32_t shift = 8 - bit_idx - bits_to_read;
114 std::uint32_t mask = (1U << bits_to_read) - 1U;
115 std::uint32_t extracted = (byte_val >> shift) & mask;
117 value = (value << bits_to_read) | extracted;
118 bit_pos_ += bits_to_read;