The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Копирование подмассива побитно."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

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

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

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Копирование подмассива побитно."  
Сообщение от Fuzzy (ok) on 05-Окт-08, 19:56 
>Тем не менее вопрос остается открытым.

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Копирование подмассива побитно."  
Сообщение от alexB (ok) on 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);
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Копирование подмассива побитно."  
Сообщение от Fuzzy (ok) on 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, так должно работать,
только надо коректировать последний байт.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Копирование подмассива побитно."  
Сообщение от f00l email(??) on 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;

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру