C ++ список битов как числа - PullRequest
       28

C ++ список битов как числа

2 голосов
/ 20 сентября 2011

Я хотел бы иметь список битов, где я могу выполнять математические операции над частью списка, например.

value: 864
as bits, pos:   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
as bits, value: 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0,  0

Если я беру биты с 1 по 4 и с 6 по 9, я получаю 0, 1, 1, 0, 1, 0, 0, 0 (104). Затем, если я добавлю 3, он станет 0, 1, 1, 0, 1, 0, 1, 1 (107).

Я мог бы сделать это с помощью std :: vector и процесса, включающего побитовые операции между битами, с кодом, который выглядит подобным образом if (xor (data [n], data [n2])) {data [n - 1] == false;} и т.д ...

Я мог бы даже использовать POD-массивы, но я думал, что C ++, находящийся так близко к внутренним частям компьютера, часто оказывается бесполезным, но здесь он может позволить выполнить эту операцию чрезвычайно быстро.

Что-то вроде сохранения значений в большой переменной POD или в массиве с последующим копированием их в память другой переменной, чтобы можно было выполнить математические операции перед тем, как снова скопировать их обратно в позицию в этом хранилище?

Еще лучше, например, может ли оператор сложения каким-либо образом использовать эту позицию в памяти в качестве параметра для выполнения сложения непосредственно в середине хранилища данных?

Ответы [ 2 ]

1 голос
/ 21 сентября 2011

Возможный быстрый способ не сработал и был бы очень ограничен.

unsigned int n = 8;
unsigned short *p1, *p2;
p1 = reinterpret_cast<unsigned short*>(&n);
p2 = reinterpret_cast<unsigned short*>((&n)+1);
std::cout<<*p1<<", "<<*p2<<std::endl;

Вот полное решение, спасибо за информацию, которая позволила мне завершить это.Вместо этого можно легко переработать использование std :: vector.

#include <math.h> // for pow in weighted_random_UINT
#include <bitset> // or std::vector<bool>

template <std::size_t T> // this line is not required with std::vector
unsigned int get_chunk(std::bitset<T>* btset, unsigned int start, unsigned int end)
{
    unsigned long out = 0;
    for(unsigned int n = start; n < end; n++)
    {
        out += unsigned long((*btset)[n] * pow(2,double(n-start)));
    }
    return out;
}

void main()
{
    // 6 bits of data in reverse order
    std::bitset<6> data (std::string("000110"));

    // all the data numerically
    std::cout<<get_chunk<6>(&data,0,5)<<std::endl;

    // the first 3 bits as a number
    std::cout<<get_chunk<6>(&data,0,2)<<std::endl;

    // the last 3 bits as a number
    std::cout<<get_chunk<6>(&data,3,5)<<std::endl;
}
1 голос
/ 20 сентября 2011

Звучит так, как вы хотите Повышение . DynamicBitset :

Класс dynamic_bitset представляет набор битов. Он обеспечивает доступ к значению отдельных битов через operator[] и предоставляет все побитовые операторы, которые можно применять к встроенным целым числам, например operator& и operator<<. Количество битов в наборе указывается во время выполнения через параметр для конструктора dynamic_bitset.

...