Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Damaks
18 / 10 / 0
Регистрация: 02.09.2010
Сообщений: 235
1

Unsigned integer 24 bit

12.08.2011, 04:24. Просмотров 1699. Ответов 8
Метки нет (Все метки)

Как можно объявить беззнаковый integer размером в 24 бита?

Если я объявлю его как битовое поле в структуре, например так:

C++
1
2
3
4
5
6
struct rgb
{
    unsigned r:24;
    unsigned g:24;
    unsigned b:24;
};
Над ним можно будет производить арифметические операции как с обычным int'ом?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2011, 04:24
Ответы с готовыми решениями:

Comparison between signed and unsigned integer expressions
Много вот таких варнингов: Comparison between signed and unsigned integer...

Что означает предупреждение " comparison between signed and unsigned integer expressions"
Я написал вот такую строчку: for(int i=0; i < stringas.size();i++){ cout...

Unary minus operator applied to unsigned type, result still unsigned
Подскажите, имеем следующий код: signed int a = -0x80000000; signed int...

Приведение типов unsigned char[2] to unsigned char [64]
Добрый день! Подскажите пожалуйста, как поступить. Есть простая функция main...

Не понятный undefined reference to `unsigned long long f<unsigned long long, void>
test.cpp: #include &lt;iostream&gt; template &lt;typename FormalType, typename...

8
Сыроежка
Заблокирован
12.08.2011, 04:29 2
Цитата Сообщение от Damaks Посмотреть сообщение
Как объявить беззнаковый integer размером в 24 бита?

Добавлено через 14 минут
Если я объявлю его как битовое поле в структуре, например так:

struct rgb
{
unsigned r:24;
unsigned g:24;
unsigned b:24;
};

с ним можно будет делать арифметические операции как с обычным int'ом?
Вы можете объявлять только те типы данных, которые предоставляет компилятор. Так что если компилятор не предоставляет такого типа, как беззнаковое размером 24 бита, то вы ничего сделать не сможете.

Что касается битовых полей, которые вы объявили в структуре, то с ними можно работать как с целыми числами, потому что в выражениях они преобразуются к целому числу типа unsigned int.
0
Damaks
18 / 10 / 0
Регистрация: 02.09.2010
Сообщений: 235
12.08.2011, 19:06  [ТС] 3
А какова будет потеря производительности? В википедии написано:
Обращение к битовым полям требует дополнительных команд процессора для маскирования и сдвига, и потому медленнее обращений к словам/байтам. Поэтому битовые поля применяются для максимально полной упаковки информации в местах, где неважна скорость доступа к информации.
Но вроде как 24 бита - это ровно 3 байта, т.е. сдвигать вроде как ничего и не надо?
0
Сыроежка
Заблокирован
12.08.2011, 19:50 4
Цитата Сообщение от Damaks Посмотреть сообщение
А какова будет потеря производительности? В википедии написано:

Но вроде как 24 бита - это ровно 3 байта, т.е. сдвигать вроде как ничего и не надо?
Дело в том, что следующее битовове поле хранит часть своих битов в оставшемся четвертом байте. То есть битовые поля непрерывны. Если вы хотите разбить их по единицам хранения, то встаьвте между ними битовое поле размером 0, и тогда следующее битовое поле будет помещаться в отдельную единицу хранения, то есть в отдельное unsigned int.
Например,

struct rgb
{
unsigned r:24;
unsigned:0;
unsigned g:24;
unsigned:0;
unsigned b:24;
};

Только я не уверен, что алгоритм выделения битов у компилятора изменится. Надо смотреть результирующий ассемблерский код.
0
easybudda
Модератор
Эксперт CЭксперт С++
10148 / 6055 / 1522
Регистрация: 25.07.2009
Сообщений: 11,476
12.08.2011, 20:02 5
Это на каждый канал по 24 бита получается? Круто! Бывает, конечно, и такое, но не часто. В 24-битной картинке по 8 бит на канал, то есть в unsigned int ещё и для альфа-канала 8 бит останется...
0
grizlik78
Эксперт С++
2015 / 1496 / 206
Регистрация: 29.05.2011
Сообщений: 3,117
12.08.2011, 20:47 6
Цитата Сообщение от easybudda Посмотреть сообщение
Это на каждый канал по 24 бита получается? Круто! Бывает, конечно, и такое, но не часто.
А я вот, кстати, тоже хотел спросить, но забыл. Где такое чудо бывает, как эти 24 бита получают и как их потом используют. На канал, разумеется
0
easybudda
Модератор
Эксперт CЭксперт С++
10148 / 6055 / 1522
Регистрация: 25.07.2009
Сообщений: 11,476
12.08.2011, 22:06 7
Цитата Сообщение от grizlik78 Посмотреть сообщение
А я вот, кстати, тоже хотел спросить, но забыл
При сканировании слайдов для увеличения глубины цвета на канал, бывает, 16 бит используют (на обычном сканере тыщи за две рублей такое конечно не исполнишь), про то, что может быть и 24, в книжках только читал, сам никогда не встречал. Но потом всё равно к 8 битам на канал сводят, в CMYK как-раз 32 получается...
0
villu
203 / 204 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
13.08.2011, 11:09 8
> Текущие возможности GEGL:
> 8-/16-/32-разрядные (с плавающей точкой) режимы, внутренняя обработка — в 128-разрядном режиме;

0
Evg
Эксперт CАвтор FAQ
19339 / 7193 / 537
Регистрация: 30.03.2009
Сообщений: 20,132
Записей в блоге: 30
13.08.2011, 11:20 9
Цитата Сообщение от Damaks Посмотреть сообщение
А какова будет потеря производительности?
Расскажите про new и delete в C++
Хотя для поля размером 24 бит запись будет немного более оптимальной - теоретически это можно сделать за три операции (два store'а и один сдвиг), а чтение - за 4 операции (два load'а, свдиг и or). При этом запись такого поля будет без чтения подолжки (потому что поле находится ровно по границам байтов), что само по себе уже быстрее, чем для произвольного поля. Но это зависит от того, насколько качественно компилятор работает с битовыми полями
0
13.08.2011, 11:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2011, 11:20

Как исправить ошибку невозможно преобразовать аргумент 1 из "unsigned int" в "unsigned int []"?
Ребят, срочно прошу вас помочь.. Есть ошибка (невозможно преобразовать...

64 bit double to 80 bit
Есть double переменная надо сделать из неё 80 - битную переменную, в интернете...

Разница int, short, unsigned int, unsigned short
Есть например цикл который проходит по массиву в котором 100 элементов. В чем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru