URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7623
[ Назад ]

Исходное сообщение
"Копирование подмассива побитно."

Отправлено alexB , 05-Окт-08 16:58 
Здравствуйте! Подскажите пожалуйста каким образом можно выполнить побитное копирование части содержимого одного массива в другой (C/C++).
Например имеем:
char * sourceArray;
char * targetArray;

Нужно скопировать из sourceArray содержимое по смещению n бит, размером k бит в targetArray.
memcpy() я так понимаю не подходит для этого дела, поскольку копирует побайтно.
И как можно смещать указатель на n бит?
Спасибо.


Содержание

Сообщения в этом обсуждении
"Копирование подмассива побитно."
Отправлено Аноним , 05-Окт-08 18:50 
>Здравствуйте! Подскажите пожалуйста каким образом можно выполнить побитное копирование части содержимого одного
>массива в другой (C/C++).
>Например имеем:
>char * sourceArray;
>char * targetArray;

Никак. Потому что адресуются байты.
Если тебе надо копировать байт частичо, используй логические операции (маски).

А ещё в c++ STL есть готовый массив битов ))



"Копирование подмассива побитно."
Отправлено alexB , 05-Окт-08 19:21 
>Никак. Потому что адресуются байты.
>Если тебе надо копировать байт частичо, используй логические операции (маски).
>
>А ещё в c++ STL есть готовый массив битов ))

Я бы не стал говорить так категорично. Есть вариант копирования через какой-нибудь 32-х разрядный контейнер со сдвигом на необходимое смещение. Но мне что-то не нравится этот алгоритм. А вот за за подсказку про STL спасибо, посмотрю.
Тем не менее вопрос остается открытым.


"Копирование подмассива побитно."
Отправлено Fuzzy , 05-Окт-08 19:56 
>Тем не менее вопрос остается открытым.

Вот вариант, копирование с битовым сдвигом,

for (i=0; i<n; i++) {
    dest[i] = (source[i] << bit) | (source[i+1] >> (8-bit));
}


"Копирование подмассива побитно."
Отправлено alexB , 05-Окт-08 20:24 
>Вот вариант, копирование с битовым сдвигом,
>
>for (i=0; i<n; i++) {
>    dest[i] = (source[i] << bit) | (source[i+1] >> (8-bit));
>}

Интересно. Сейчас попробую. Спасибо.


"Копирование подмассива побитно."
Отправлено alexB , 05-Окт-08 21:00 
>>Вот вариант, копирование с битовым сдвигом,
>>
>>for (i=0; i<n; i++) {
>>    dest[i] = (source[i] << bit) | (source[i+1] >> (8-bit));
>>}
>

Вроде работает. Только по-моему надо маскировать сдвиг старшего байта:
for (i=0; i<n; i++) {
    dest[i] = (source[i] << bit) | ((source[i+1] >> (8-bit)) & 0xF);
}


"Копирование подмассива побитно."
Отправлено Fuzzy , 05-Окт-08 21:15 
>Вроде работает. Только по-моему надо маскировать сдвиг старшего байта:
>for (i=0; i<n; i++) {
>    dest[i] = (source[i] << bit) | ((source[i+1] >> (8-bit)) & 0xF);
>}

Если тип unsigned, (unsigned char) то после сдига та часть откуда сдвинули заполняется нулями, а так неопроеделено.
http://www.opennet.me/docs/RUS/ansi-c/ansi-c-5.html#ss5.3

И я не думаю что надо маскировать,
в примере тип должен быть unsigned char, так должно работать,
только надо коректировать последний байт.


"Копирование подмассива побитно."
Отправлено f00l , 06-Окт-08 07:27 
>[оверквотинг удален]
>Например имеем:
>char * sourceArray;
>char * targetArray;
>
>Нужно скопировать из sourceArray содержимое по смещению n бит, размером k бит
>в targetArray.
>memcpy() я так понимаю не подходит для этого дела, поскольку копирует побайтно.
>
>И как можно смещать указатель на n бит?
>Спасибо.

Если n и k известны можно используй битовые поля примерно так
struct uc
{
unsigned char bit_0 : 1;
unsigned char bit_1 : 1;
unsigned char bit_2 : 1;
unsigned char bit_3 : 1;
unsigned char bit_4 : 1;
unsigned char bit_5 : 1;
unsigned char bit_6 : 1;
unsigned char bit_7 : 1;
};

struct uc sourceArray;
struct uc targetArray;

targetArray.bit_0 = sourceArray.bit_0;


"Копирование подмассива побитно."
Отправлено alexB , 06-Окт-08 21:54 
Всем спасибо!
Вариант
for (i=0; i<n; i++) {
    dest[i] = (source[i] << bit) | (source[i+1] >> (8-bit));
}
меня в принципе устраивает.