![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Задача такая, есть массив каких то данных, нужна функция которая будет читать из этих данных поочередно указанное в параметре функции количество битов...
Я делая так Знаю что конкретная позиция чтения бита находится в 2-ом элементе массива... Мне нужны три бита из 2-ого элемента..но не из начала а начиная со второго бита...
Генерирую маску в виде Первый бит игнорирутется, потом три бита читаем и остальные игнорируем... Потом зная количество добавленных в конце байта нулей делаю c >>= 4 И в результате получается 0101 то что мне нужно...волнует только одно, способ какой то неграмотный...для генерации маски нужна итерация, это будет тормозить программу...в битовых операциях должно быть что нибудь подходящее для данной задачи...если кто знает помогите.. Заранее спасибо... Это сообщение отредактировал(а) azesmcar - 6.12.2004, 11:08 |
|||
|
||||
Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Я чего-то, наверно, не понял: можно же прочитать весь 2-й элемент, его (elem &= 01110000), и все... Зачем генерировать маску? Она же постоянная?
Должно быть (сдвиг у тебя там на 1 вправо лишний ![]()
Ну можно еще сперва <<=1, потом >>=5. Это сообщение отредактировал(а) Hroft - 6.12.2004, 11:25 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Незнаю как насчет чтения всего элемента но вот со сдвигами мне понравилось...ну я же говорю есть более цивилизованный способ...
![]() |
|||
|
||||
Peter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 28.7.2003 Где: Ставрополь Репутация: -1 Всего: 1 |
Я с такой проблемой сталкивался. Мне кажется, более "цивилизованного" способа не существует.
-------------------- всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23). |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Я имел ввиду более цивилизованный способ чем мой...
Вот я и говорю что со сдвигами мне понравилось...
Это насчет цивилизованности я выше говорил... |
|||
|
||||
Mad |
|
|||
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 7 Всего: 19 |
azesmcar
Без маски не обойтись, но генерить её не обязательно, можно хранить заранее подготовленные ( ![]() Добавлено @ 14:32 Посмотри реализацию выбора из потока для lzw алгоритма (gzip). |
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
а если посмотреть в сторону std::bitset ?
|
|||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Вот как раз что то на подобие этого битсета я и реализую... Тут другая проблема возникла... есть массив
Логично..int так и должен себя вести, а вот как это обойти, не переворачивая (это лишнее действие)..например вполне подойдет что то вроде memcpy но с параметром для обратного копирования, т.е. ему что с одной стороны копировать что с другой разницы особой нету...на производительность не повлияет...
Не так уж и много??? Ну может быть, но мне во первых для int а нужно, во вторых зачем держать целую таблицу а потом там поиск реализовывать? генерация быстрее будет работать нежели поиск в таблице с 3-х значным размером... Это сообщение отредактировал(а) azesmcar - 7.12.2004, 09:37 |
||||||
|
|||||||
bel_nikita |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
лучше заменить на:
Добавлено @ 09:43
|
||||||||||
|
|||||||||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Абсолютно никакой разницы не последует, лучше...но все равно переворачивать надо...
В принципе можно, я и так писал, но мне не не нужно изменять значения в массиве (так как я потом будут с этим r -ом довольно таки долго извращяться битовыми операциями )... Но это в принципе не важно...Насколько я знаю при обявлении int уже выделяется память с которой будет работать система в обратном порядке...и единственное что можно сделать скопировать туда уже перевернытое значение... То бишь получается я пишу
Добавлено @ 09:46 Это я до твоего добавления писал ![]() Добавлено @ 09:54 Кстати, тоже самое... вот полный код
Это сообщение отредактировал(а) azesmcar - 7.12.2004, 09:55 |
||||
|
|||||
bel_nikita |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Разница:
Чувствуешь? ![]() |
||||||
|
|||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Я не об этом, я о том что в любом случае программа не работает
![]() Я пробовал во всех вариантах, memcpy был самым последним...вот он и увековечил себя в моем неработающем source-e ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
А ну его...так работает...
![]() 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 |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Нет! Byteorder разный на разных процессорах. Его можно определить в программе, но обычно это делается уже в makefil'е до компиляции. |
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
добавлю
![]() на x86 семействе и на остальных, как правило, всегда старший-младший ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |