powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Битовый массив
15 сообщений из 15, страница 1 из 1
Битовый массив
    #34231520
kutuzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Имеется битовый массив
char * mask1;
mask1 = new char[Mask1Size];
Мне надо убрать из массива (к примеру) биты от 15 до 23.
для этого я создаю новый массив, на заданное числи меньше чем первый.
char * mask2;
mask2 = new char[Mask2Size]
прохожу по каждому байту и проверяю какие биты установленны и записываю их в новый массив (пропуская биты с 15 по 23)

может кто подскажет более элегантный вариант копирования битовых массивов с исключением данных битов??
А то я ничего не могу придумать :(
...
Рейтинг: 0 / 0
Битовый массив
    #34231534
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kutuzovможет кто подскажет более элегантный вариант копирования битовых массивов с исключением данных битов?ну если только перейти к операциям с байтами... Например, в данном случае первый байт явно останется неизменным, т.е. незачем разбирать его по битам.
...
Рейтинг: 0 / 0
Битовый массив
    #34231637
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	DWORD mask1, mask2;
	DWORD m, i;

	mask1 = 0x12345678;
	m= 0 ;
	for(i= 0 ; i <  15  ; i++) m |=  1  << i;
	mask2 = mask1 & m;

	m = ~ 0  <<  23 ;
	mask2 |= (mask1 & m) >> ( 23 - 15 );
	printf("%lX\n", mask1);
	printf("%lX\n", mask2);
...
Рейтинг: 0 / 0
Битовый массив
    #34232009
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Загнать в битмап, а потом выбрать из него что надо в новый массив.
...
Рейтинг: 0 / 0
Битовый массив
    #34232033
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. битсет.
...
Рейтинг: 0 / 0
Битовый массив
    #34232058
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
int cutFrom  15 ;
int cutTo  32 

  //промежуточный массив
bitset<Mask1Size> bOld;
bitset<Mask2Size> bNew;
  //Заполнение
for (int i= 0  ; i<Mask1Size ; i++)
   bOld[i]=(mask1[i/ 8 ]&( 1 <<i% 8 ))>>i% 8 ;
  //Перестановка
for (int i= 0  ; i<Mask1Size ; i++)
   if (i<cutFrom)
       bNew[i]=bOld[i];
    else if (i>cutTo)
       bNew[i-(cutTo-cutFrom+ 1 )]=bOld[i];
  //Вытаскивание
for (int i= 0  ; i<Mask2Size ; i++)
     mask2[i/ 8 ]|=bNew[i]<<(i% 8 )

Есстественно mask2 предварительно очистить.
Примерно так, насчет индексов надо проверить.
Выглядит страшновато, зато красиво и элегантно.
Можно как-то сделать красивее, учитывая, что cutTo-cutFrom+1 == Mask1Size-Mask2Size
...
Рейтинг: 0 / 0
Битовый массив
    #34266501
kutuzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkhНапример так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
int cutFrom  15 ;
int cutTo  32 

  //промежуточный массив
bitset<Mask1Size> bOld;
bitset<Mask2Size> bNew;
  //Заполнение
for (int i= 0  ; i<Mask1Size ; i++)
   bOld[i]=(mask1[i/ 8 ]&( 1 <<i% 8 ))>>i% 8 ;
  //Перестановка
for (int i= 0  ; i<Mask1Size ; i++)
   if (i<cutFrom)
       bNew[i]=bOld[i];
    else if (i>cutTo)
       bNew[i-(cutTo-cutFrom+ 1 )]=bOld[i];
  //Вытаскивание
for (int i= 0  ; i<Mask2Size ; i++)
     mask2[i/ 8 ]|=bNew[i]<<(i% 8 )

Есстественно mask2 предварительно очистить.
Примерно так, насчет индексов надо проверить.
Выглядит страшновато, зато красиво и элегантно.
Можно как-то сделать красивее, учитывая, что cutTo-cutFrom+1 == Mask1Size-Mask2Size
Спасибо за ответ,
вычисляю Mask1Size, и в строчке bitset<Mask1Size> bOld;
получаю:
Template argument must be a constant expression
Как это исправить??
...
Рейтинг: 0 / 0
Битовый массив
    #34267017
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kutuzov AkhНапример так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
int cutFrom  15 ;
int cutTo  32 

  //промежуточный массив
bitset<Mask1Size> bOld;
bitset<Mask2Size> bNew;
  //Заполнение
for (int i= 0  ; i<Mask1Size ; i++)
   bOld[i]=(mask1[i/ 8 ]&( 1 <<i% 8 ))>>i% 8 ;
  //Перестановка
for (int i= 0  ; i<Mask1Size ; i++)
   if (i<cutFrom)
       bNew[i]=bOld[i];
    else if (i>cutTo)
       bNew[i-(cutTo-cutFrom+ 1 )]=bOld[i];
  //Вытаскивание
for (int i= 0  ; i<Mask2Size ; i++)
     mask2[i/ 8 ]|=bNew[i]<<(i% 8 )

Есстественно mask2 предварительно очистить.
Примерно так, насчет индексов надо проверить.
Выглядит страшновато, зато красиво и элегантно.
Можно как-то сделать красивее, учитывая, что cutTo-cutFrom+1 == Mask1Size-Mask2Size
Спасибо за ответ,
вычисляю Mask1Size, и в строчке bitset<Mask1Size> bOld;
получаю:
Template argument must be a constant expression
Как это исправить??

Mask1Size должено быть числом, макросом или константной переменной.
...
Рейтинг: 0 / 0
Битовый массив
    #34267110
kutuzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh kutuzov AkhНапример так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
int cutFrom  15 ;
int cutTo  32 

  //промежуточный массив
bitset<Mask1Size> bOld;
bitset<Mask2Size> bNew;
  //Заполнение
for (int i= 0  ; i<Mask1Size ; i++)
   bOld[i]=(mask1[i/ 8 ]&( 1 <<i% 8 ))>>i% 8 ;
  //Перестановка
for (int i= 0  ; i<Mask1Size ; i++)
   if (i<cutFrom)
       bNew[i]=bOld[i];
    else if (i>cutTo)
       bNew[i-(cutTo-cutFrom+ 1 )]=bOld[i];
  //Вытаскивание
for (int i= 0  ; i<Mask2Size ; i++)
     mask2[i/ 8 ]|=bNew[i]<<(i% 8 )

Есстественно mask2 предварительно очистить.
Примерно так, насчет индексов надо проверить.
Выглядит страшновато, зато красиво и элегантно.
Можно как-то сделать красивее, учитывая, что cutTo-cutFrom+1 == Mask1Size-Mask2Size
Спасибо за ответ,
вычисляю Mask1Size, и в строчке bitset<Mask1Size> bOld;
получаю:
Template argument must be a constant expression
Как это исправить??

Mask1Size должено быть числом, макросом или константной переменной.

Я пишу:
const int Mask1Size=OldSize;
bitset<Mask1Size> bOld;
Template argument must be a constant expression

Или это не константная переменная
...
Рейтинг: 0 / 0
Битовый массив
    #34267230
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kutuzov
Я пишу:
const int Mask1Size=OldSize;
bitset<Mask1Size> bOld;
Template argument must be a constant expression

Или это не константная переменная

для OldSize такие же ограничения.
...
Рейтинг: 0 / 0
Битовый массив
    #34267296
kutuzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh kutuzov
Я пишу:
const int Mask1Size=OldSize;
bitset<Mask1Size> bOld;
Template argument must be a constant expression

Или это не константная переменная

для OldSize такие же ограничения.

т.е. OldSize сделать const?
так она же динамически меняется :(

размер bitset надо как константу задать?
...
Рейтинг: 0 / 0
Битовый массив
    #34267436
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kutuzovразмер bitset надо как константу задать?

Да. Размер используется не только при выполнении, но и на стадии компиляции программы.
Тогда задай с запасом.
...
Рейтинг: 0 / 0
Битовый массив
    #34268326
kutuzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	DWORD mask1, mask2;
	DWORD m, i;

	mask1 = 0x12345678;
	m= 0 ;
	for(i= 0 ; i <  15  ; i++) m |=  1  << i;
	mask2 = mask1 & m;

	m = ~ 0  <<  23 ;
	mask2 |= (mask1 & m) >> ( 23 - 15 );
	printf("%lX\n", mask1);
	printf("%lX\n", mask2);


Тогда такой вареант более преемлим... да и побыстрее наветное работать будет...
Этот пример для переменной(DWORD).

А у меня указатель на на массив известной длинны(UINT8 *mask).
задача состоит в том чтобы из этого убрасть с 15-25 бит.
...
Рейтинг: 0 / 0
Битовый массив
    #34269271
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kutuzovТогда такой вареант более преемлим... да и побыстрее наветное работать будет...
Этот пример для переменной(DWORD).

А у меня указатель на на массив известной длинны(UINT8 *mask).
задача состоит в том чтобы из этого убрасть с 15-25 бит.
Ну так сформируй DWORD из массива и все.
Добавь в мой пример строку:
Код: plaintext
mask1 = (mask[ 0 ] <<  24 ) | (mask[ 1 ] <<  16 ) | (mask[ 2 ] <<  8 ) | mask[ 3 ];
Или в каком порядке у тебя идут байты в массиве?
...
Рейтинг: 0 / 0
Битовый массив
    #34269313
kutuzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl kutuzovТогда такой вареант более преемлим... да и побыстрее наветное работать будет...
Этот пример для переменной(DWORD).

А у меня указатель на на массив известной длинны(UINT8 *mask).
задача состоит в том чтобы из этого убрасть с 15-25 бит.
Ну так сформируй DWORD из массива и все.
Добавь в мой пример строку:
Код: plaintext
mask1 = (mask[ 0 ] <<  24 ) | (mask[ 1 ] <<  16 ) | (mask[ 2 ] <<  8 ) | mask[ 3 ];
Или в каком порядке у тебя идут байты в массиве?

Не очень я понимаю :)
Это сработает в том случае если массив меньше 4 байт...

Реально так выглядит.

char * mask;
...
MaskSize=150;
mask = new char[MaskSize];

...
// функция вырезающая биты от m до n. т.е. Если надо вырезать 16 бит то размер нового
// массива должен быть 148
CutMask(m,n)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Битовый массив
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]