The OpenNET Project / Index page

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

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

"Сдвиговые операции, char, 3 байта в 2. " 
Сообщение от cobol Искать по авторуВ закладки(ok) on 27-Ноя-05, 20:27  (MSK)
Есть буффер с тремя байтами (r,g,b) 24 бита.  Нужно после дизеренга получить 15 байт, и уместить их в 2 байта. Т.е. было по 8 бит на цвет, результат должен быть 5 бит на цвет (+1 бит пустой, роли особой не играет сейчас).

Итак, буфер есть, функция дизеренга есть (которая преобразует эти 3 байта в 5 битные значения.  И выдает как результат обновленные (но все еще 3) байта.

Нужно получить 2 байта.

Т.е. было:

char *buf[2];

char buf[0]=255;
char buf[1]=255;
char buf[2]=255;

далее dither(buf);

и имеем:

char buf[0]=248;
char buf[1]=248;
char buf[2]=248;

Теперь из результата нужно сделать 2 байта. Т.е. сдвинуть их в кучу. Как это релизовать и как быть с char ? сначала в int ковертить, потом чтото творить со сдвигами, или как ?

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

 Оглавление

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

1. "Сдвиговые операции, char, 3 байта в 2. " 
Сообщение от Андрей Искать по авторуВ закладки(??) on 28-Ноя-05, 23:37  (MSK)
в языке C есть такое понятие, как битовые поля, но я к сожалению про них только слышал, поэтому ничего большего сказать не могу.

можно решить проблему с помощью сдвигов и прочих И, ИЛИ
предполагаю что биты лежать в строке то есть вначале идут биты 0-го байта потом первого и затем второго слева на право. у меня постоянные проблемы с большими и маленькими индейцами поэтому нарисую как я себе это представляю:
248 = "11111000" и весь буфер выглядит вот так "11111000.11111000.11111000"

начало алгоритма мне видится такое,
0-й байт остаётся на месте
от 1-го отрезаются всё кроме левых 111 и сдвигаем их на 5 позиций вправо ((buf[1] & 0xE0) >> 5)
прибавим результат к байту 0 (buf[0] | ((buf[1] & 0xE0) >> 5))
потом находим два оставшихся бита от байта 1 и сдвигаем их влево до упора
затем проделываем обрезание и сдвиги и склеивания с между байтами 1 и 2.

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


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

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




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

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