Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с битами, Черт бы их побрал... 
:(
    Опции темы
azesmcar
Дата 6.12.2004, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Задача такая, есть массив каких то данных, нужна функция которая будет читать из этих данных поочередно указанное в параметре функции количество битов...

Я делая так
Знаю что конкретная позиция чтения бита находится в 2-ом элементе массива...
Мне нужны три бита из 2-ого элемента..но не из начала а начиная со второго бита...
Код

00111010 11011010 01010101
         01110000
----------------------------------------
         01010000


Генерирую маску в виде
Первый бит игнорирутется, потом три бита читаем и остальные игнорируем...
Потом зная количество добавленных в конце байта нулей делаю c >>= 4
И в результате получается 0101 то что мне нужно...волнует только одно, способ какой то неграмотный...для генерации маски нужна итерация, это будет тормозить программу...в битовых операциях должно быть что нибудь подходящее для данной задачи...если кто знает помогите..
Заранее спасибо...

Это сообщение отредактировал(а) azesmcar - 6.12.2004, 11:08
PM   Вверх
Hroft
Дата 6.12.2004, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



Я чего-то, наверно, не понял: можно же прочитать весь 2-й элемент, его (elem &= 01110000), и все... Зачем генерировать маску? Она же постоянная?
Должно быть (сдвиг у тебя там на 1 вправо лишний smile ):
Код

00111010 11011010 01010101
        01110000
----------------------------------------
        01010000

Ну можно еще сперва <<=1, потом >>=5.

Это сообщение отредактировал(а) Hroft - 6.12.2004, 11:25
PM MAIL ICQ   Вверх
azesmcar
Дата 6.12.2004, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Незнаю как насчет чтения всего элемента но вот со сдвигами мне понравилось...ну я же говорю есть более цивилизованный способ...smile) спасибо
PM   Вверх
Peter
Дата 6.12.2004, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



Я с такой проблемой сталкивался. Мне кажется, более "цивилизованного" способа не существует.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
azesmcar
Дата 6.12.2004, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Я имел ввиду более цивилизованный способ чем мой...
Вот я и говорю что со сдвигами мне понравилось...
Цитата
в битовых операциях должно быть что нибудь подходящее для данной задачи

Это насчет цивилизованности я выше говорил...
PM   Вверх
Mad
Дата 6.12.2004, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



azesmcar
Без маски не обойтись, но генерить её не обязательно, можно хранить заранее подготовленные ( байта не так уж и много получается smile )
Добавлено @ 14:32
Посмотри реализацию выбора из потока для lzw алгоритма (gzip).


--------------------
user posted image
PM MAIL   Вверх
bel_nikita
Дата 6.12.2004, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



а если посмотреть в сторону std::bitset ?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 7.12.2004, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата
а если посмотреть в сторону std::bitset ?

Вот как раз что то на подобие этого битсета я и реализую...
Тут другая проблема возникла...
есть массив
Код

const unsigned char *p = (unsigned char*)("0123");
unsigned int r;
memcpy( &r, p, 4 );
// Теперь в r э получаеться поотдельности взятые коды чисел в бинарном виде 0, 1, 2 и 3 но только в перевернутом порядке...


Логично..int так и должен себя вести, а вот как это обойти, не переворачивая (это лишнее действие)..например вполне подойдет что то вроде memcpy но с параметром для обратного копирования, т.е. ему что с одной стороны копировать что с другой разницы особой нету...на производительность не повлияет...


Цитата
Без маски не обойтись, но генерить её не обязательно, можно хранить заранее подготовленные ( байта не так уж и много получается  )


Не так уж и много??? Ну может быть, но мне во первых для int а нужно, во вторых зачем держать целую таблицу а потом там поиск реализовывать? генерация быстрее будет работать нежели поиск в таблице с 3-х значным размером...

Это сообщение отредактировал(а) azesmcar - 7.12.2004, 09:37
PM   Вверх
bel_nikita
Дата 7.12.2004, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
Код
const unsigned char *p = (unsigned char*)("0123");
unsigned int r;
memcpy( &r, p, 4 );

лучше заменить на:
Код
r = *(int*)p;

Добавлено @ 09:43
Цитата
а вот как это обойти, не переворачивая (это лишнее действие)..например вполне подойдет что то вроде memcpy но с параметром для обратного копирования
сделай, что-то вроде:
Код

typedef struct _MyStruct {
 union{
   int   _int;
   char  _char[4];
 };
} MyStruct;



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 7.12.2004, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Абсолютно никакой разницы не последует, лучше...но все равно переворачивать надо...
В принципе можно, я и так писал, но мне не не нужно изменять значения в массиве (так как я потом будут с этим r -ом довольно таки долго извращяться битовыми операциями )... Но это в принципе не важно...Насколько я знаю при обявлении int уже выделяется память с которой будет работать система в обратном порядке...и единственное что можно сделать скопировать туда уже перевернытое значение...

То бишь получается я пишу
Код

const unsigned char *p = (unsigned char*)("0123");
unsigned int r;
memcpy( &r, p, 4 );
r >>= 24; //и после этого должен получить 48 (значение первого байта а получаю 51)

Добавлено @ 09:46
Это я до твоего добавления писал smile) спасибо, в принципе идейка что надо...шас попробуем
Добавлено @ 09:54
Кстати, тоже самое...
вот полный код
Код

typedef union
{
unsigned int _int;
unsigned char _str[4];
} _bit;

int main()
{
unsigned char p[4] = {'2', '0', '0', '0'};
unsigned int pp;
_bit t;
memcpy(t._str, p, 4);
printf("%d", t._int >> 24 );
return 0;
}


Это сообщение отредактировал(а) azesmcar - 7.12.2004, 09:55
PM   Вверх
bel_nikita
Дата 7.12.2004, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
Абсолютно никакой разницы не последует, лучше...но все равно переворачивать надо...

Разница:
Код
;memcpy( &r, p, 4 );
push        4
mov         eax,dword ptr [ebp-10h]
push        eax
lea         ecx,[ebp-14h]
push        ecx
call        memcpy (0040acb0); вызываем процедуру, короче очень долго :)
add         esp,0Ch

Код
;r = *(int*)p;
mov         eax,dword ptr [ebp-10h]
mov         ecx,dword ptr [eax]
mov         dword ptr [ebp-14h],ecx

Чувствуешь? smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 7.12.2004, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Я не об этом, я о том что в любом случае программа не работает smile

Я пробовал во всех вариантах, memcpy был самым последним...вот он и увековечил себя в моем неработающем source-e smile


PM   Вверх
azesmcar
Дата 7.12.2004, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



А ну его...так работает...smile

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 переворачивается??? Если нет придется совсем туго...
PM   Вверх
sergejzr
Дата 7.12.2004, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(azesmcar @ 7.12.2004, 09:55)
.а разве на всех процессорах int переворачивается???

Нет! Byteorder разный на разных процессорах. Его можно определить в программе, но обычно это делается уже в makefil'е до компиляции.



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
bel_nikita
Дата 7.12.2004, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



добавлю smile
на x86 семействе и на остальных, как правило, всегда старший-младший smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1016 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.