| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Работа с битами |
| Автор: azesmcar 6.12.2004, 11:05 | ||
| Задача такая, есть массив каких то данных, нужна функция которая будет читать из этих данных поочередно указанное в параметре функции количество битов... Я делая так Знаю что конкретная позиция чтения бита находится в 2-ом элементе массива... Мне нужны три бита из 2-ого элемента..но не из начала а начиная со второго бита...
Генерирую маску в виде Первый бит игнорирутется, потом три бита читаем и остальные игнорируем... Потом зная количество добавленных в конце байта нулей делаю c >>= 4 И в результате получается 0101 то что мне нужно...волнует только одно, способ какой то неграмотный...для генерации маски нужна итерация, это будет тормозить программу...в битовых операциях должно быть что нибудь подходящее для данной задачи...если кто знает помогите.. Заранее спасибо... |
| Автор: Hroft 6.12.2004, 11:23 | ||
| Я чего-то, наверно, не понял: можно же прочитать весь 2-й элемент, его (elem &= 01110000), и все... Зачем генерировать маску? Она же постоянная? Должно быть (сдвиг у тебя там на 1 вправо лишний
Ну можно еще сперва <<=1, потом >>=5. |
| Автор: azesmcar 6.12.2004, 11:47 |
| Незнаю как насчет чтения всего элемента но вот со сдвигами мне понравилось...ну я же говорю есть более цивилизованный способ... |
| Автор: Peter 6.12.2004, 12:01 |
| Я с такой проблемой сталкивался. Мне кажется, более "цивилизованного" способа не существует. |
| Автор: azesmcar 6.12.2004, 12:07 | ||
| Я имел ввиду более цивилизованный способ чем мой... Вот я и говорю что со сдвигами мне понравилось...
Это насчет цивилизованности я выше говорил... |
| Автор: Mad 6.12.2004, 14:30 |
| azesmcar Без маски не обойтись, но генерить её не обязательно, можно хранить заранее подготовленные ( Добавлено @ 14:32 Посмотри реализацию выбора из потока для lzw алгоритма (gzip). |
| Автор: bel_nikita 6.12.2004, 21:18 |
| а если посмотреть в сторону std::bitset ? |
| Автор: azesmcar 7.12.2004, 09:03 | ||||||
Вот как раз что то на подобие этого битсета я и реализую... Тут другая проблема возникла... есть массив
Логично..int так и должен себя вести, а вот как это обойти, не переворачивая (это лишнее действие)..например вполне подойдет что то вроде memcpy но с параметром для обратного копирования, т.е. ему что с одной стороны копировать что с другой разницы особой нету...на производительность не повлияет...
Не так уж и много??? Ну может быть, но мне во первых для int а нужно, во вторых зачем держать целую таблицу а потом там поиск реализовывать? генерация быстрее будет работать нежели поиск в таблице с 3-х значным размером... |
| Автор: bel_nikita 7.12.2004, 09:37 | ||||||||||
лучше заменить на:
Добавлено @ 09:43
|
| Автор: azesmcar 7.12.2004, 09:44 | ||||
| Абсолютно никакой разницы не последует, лучше...но все равно переворачивать надо... В принципе можно, я и так писал, но мне не не нужно изменять значения в массиве (так как я потом будут с этим r -ом довольно таки долго извращяться битовыми операциями )... Но это в принципе не важно...Насколько я знаю при обявлении int уже выделяется память с которой будет работать система в обратном порядке...и единственное что можно сделать скопировать туда уже перевернытое значение... То бишь получается я пишу
Добавлено @ 09:46 Это я до твоего добавления писал Добавлено @ 09:54 Кстати, тоже самое... вот полный код
|
| Автор: bel_nikita 7.12.2004, 09:58 | ||||||
Разница:
Чувствуешь? |
| Автор: azesmcar 7.12.2004, 10:15 |
| Я не об этом, я о том что в любом случае программа не работает Я пробовал во всех вариантах, memcpy был самым последним...вот он и увековечил себя в моем неработающем source-e |
| Автор: azesmcar 7.12.2004, 10:55 |
| А ну его...так работает... int main() { unsigned char p[4] = {'0', '0', '0', '2'}; unsigned int pp; ((char*)(&pp))[3] = p[0]; ((char*)(&pp))[2] = p[1]; ((char*)(&pp))[1] = p[2]; ((char*)(&pp))[0] = p[3]; printf("%d", pp >> 24 ); return 0; } А вот тут уж встает совсем проблемачитный вопрос...а разве на всех процессорах int переворачивается??? Если нет придется совсем туго... |
| Автор: sergejzr 7.12.2004, 12:37 | ||
Нет! Byteorder разный на разных процессорах. Его можно определить в программе, но обычно это делается уже в makefil'е до компиляции. |
| Автор: bel_nikita 7.12.2004, 23:03 |
| добавлю на x86 семействе и на остальных, как правило, всегда старший-младший |
| Автор: azesmcar 8.12.2004, 11:51 |
| Программа работает на 8xx тестируется на x86... 8хх не переворачивает числа... По всей видимости запихну в Makefile эту опцию...в одном случае переверну, в другом случае нет, другого выхода не вижу... |