LINUX.ORG.RU

Ответ на: комментарий от golodranez

...Сишного кода

Настоящим мужикам, пишущим «Сишный код», этот QBitArray не нужен. Достаточно обычных массивов и битовых операций.

pathfinder ★★★★
()
Последнее исправление: pathfinder (всего исправлений: 2)

Ты бы более подробно описал, что хочешь сделать и зачем.

anonymous
()
Ответ на: комментарий от golodranez

Я как-то делал циклическую очередь в которую заталкиваешь (или достаешь) некоторое количество бит (от 1 до 31). Ну, то есть битовый FIFO.

Реализация этой штуки уже не такая простая. Без необходимости браться за написание точно не стоит.

pathfinder ★★★★
()

А какова стоит задача?

andreyu ★★★★★
()
Ответ на: комментарий от Pavval

RLY?

Кхм, если есть элегантное и простое решение от Pavval, хотел бы его увидеть. Надеюсь ты не собираешься предложить хранить по биту в каждом байте.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Реализация этой штуки уже не такая простая.

:)

И какое отношение это имеет к теме разговора?

По теме же, используй вариант из std или напиши функцию QBitArray byte2bitarray(char byte /* or char* bytes */) — минутное дело, и от «сишности» в пользовательском коде избавишься.

staseg ★★★★★
()
Ответ на: комментарий от staseg

И какое отношение это имеет к теме разговора?

Возможно прямое, возможно косвенное, возможно никакого. Трудно сказать. Как-то туманно задан вопрос. Понятно, что ТС хочет «запихнуть байты» в битовый контейнер. Но запихнуть - это как? Может он хочет некоторой аналогии с push_back() в std::vector? Или ему нужно получить доступ байтовому буферу, где хранятся биты?

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Но запихнуть - это как? Может он хочет некоторой аналогии с push_back() в std::vector? Или ему нужно получить доступ байтовому буферу, где хранятся биты?

Скажи, как нужно интерпретировать слово «запихать», чтобы подумать вот это? Из формулировки очевидно, что у него есть байт (или их набор), которые нужно распердолить на биты представить в виде битового вектора.

staseg ★★★★★
()
Ответ на: комментарий от pathfinder

Кхм, если есть элегантное и простое решение от Pavval, хотел бы его увидеть. Надеюсь ты не собираешься предложить хранить по биту в каждом байте.

Берешь тот же list в качестве базового контейнера, размер элемента в байтах подбираешь под требования. Дополнительно хранишь сколько бит валидно в первом и последнем элементе. Дальше рассказывать?

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

Берешь тот же list в качестве базового контейнера

Ннда, list в качестве базового контейнера, говоришь. Регулярные выделения/освобождения памяти не смущают? Мне бы такое решение не подошло.

Где-то применение std::list может показаться элегантным, где-то нет. Зависит от конкретного случая. Я не хочу вступать в спор на эту тему.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Я просто высказал первый пришедший в голову вариант. Суть в том, что даже лучшая реализация (возможно что-то типа списка, используемого как кольцевой битовый буфер) не будет какой-то супер-сложной.

Pavval ★★★★★
()
Ответ на: комментарий от pathfinder

Надеюсь ты не собираешься предложить хранить по биту в каждом байте.

Хочет)

golodranez ★★★★
() автор топика
Ответ на: комментарий от staseg

или напиши функцию QBitArray byte2bitarray(char byte /* or char* bytes */) — минутное дело, и от «сишности» в пользовательском коде избавишься.

Так и сделал пока. Просто непонятно почему в Qt такого нет.

golodranez ★★★★
() автор топика
Ответ на: комментарий от staseg

Скажи, как нужно интерпретировать слово «запихать», чтобы подумать вот это? Из формулировки очевидно, что у него есть байт (или их набор), которые нужно распердолить на биты представить в виде битового вектора.

Ты правильно меня понял.

golodranez ★★★★
() автор топика
QBitArray bytesToBits(const QByteArray &bytes) const
{
    QBitArray bits;
    bits.resize(bytes.size()*8);
    // Convert from QByteArray to QBitArray
    for(int i=0; i<bytes.count(); ++i)
        for(int b=0; b<8; ++b)
            bits.setBit(i*8+b, bytes.at(i)&(1<<(7-b)));
    return bits;
}
 
 
QByteArray bitsToBytes(const QBitArray &bits) const
{
    QByteArray bytes;
    bytes.resize(bits.size()/8);
 
    // Convert from QBitArray to QByteArray
    for(int b=0; b<bits.count(); ++b)
        bytes[b/8] = (bytes.at(b/8) | ((bits[b]?1:0)<<(b%8)));
    return bytes;
}
HighwayStar ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.