В битах, я могу использовать "to_ulong" для определенного диапазона битов?
Привет, я работаю над тем, что требует от меня, чтобы получить доступ к конкретному / диапазон битов. Я решил использовать набор битов, потому что легко получить доступ к определенным битам, но могу ли я извлечь целый диапазон битов?
2 ответа
Метод А:
return (the_bitset >> start_bit).to_ulong();
Метод B (быстрее, чем метод A в 100 раз на моей машине):
unsigned long mask = 1;
unsigned long result = 0;
for (size_t i = start_bit; i < end_bit; ++ i) {
if (the_bitset.test(i))
result |= mask;
mask <<= 1;
}
return result;
Один полный пример:
#include <bitset>
#include <iostream>
#include <spdlog/spdlog.h>
template<std::size_t FROM, std::size_t TO, std::size_t SIZE>
std::bitset<TO - FROM> subBitSet(std::bitset<SIZE> &fromBitSet) {
std::bitset<TO - FROM> toBitSet;
for (int i = 0; i < TO - FROM; ++i) toBitSet.set(i, fromBitSet[i + FROM]);
return toBitSet;
}
int main() {
std::bitset<8> bitSet("10110000");
std::cout << "BitSet: " << bitSet << std::endl;
std::cout << "(0,4]: " << subBitSet<0, 4>(bitSet) << std::endl;
std::cout << "(2,6]: " << subBitSet<2, 6>(bitSet) << std::endl;
std::cout << "(4,8]: " << subBitSet<4, 8>(bitSet) << std::endl;
}
Выход
BitSet: 10110000
(0,4]: 0000
(2,6]: 1100
(4,8]: 1011