Форум программистов, компьютерный форум CyberForum.ru

Маска байта - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Определить минимальный среди элементов побочной диагонали матрицы http://www.cyberforum.ru/cpp-beginners/thread609997.html
помогите пожалуйста написать программу Дана целочисленная квадратная матрица. Определить минимальный среди элементов побочной диагонали. Для ввода, вывода и обработки матрицы использовать функции.
C++ Помоги разобравться с нескольками прогами Объясните, какие действия выполняет каждая строка в 6 программах. №1. .... int add(int n, int m) {return n + m;} int divi(int n, int m) {return n / m;} int mult(int n, int m) {return n * m;} int subt(int n, int m) {return n - m;} void main() { http://www.cyberforum.ru/cpp-beginners/thread609991.html
Работа с файлами C++
Напишите пожалуйста программу ( с комментариями по возможности ) Информация об участниках спортивных соревнований содержит: - Ф.И.О. игрока; - игровой номер; - возраст; - рост; - вес; Вывести информацию о самой молодой, рослой и легкой команде.
C++ Определить среднюю массу мальчиков и средний рост девочек
Напишите пожалуйста программу(с комментариями по возможности): "По данным сведениям об учениках класса определить среднюю массу мальчиков и средний рост девочек. Кто из учеников класса самый высокий?"
C++ Попадает ли точка с заданными координатами в полукруг http://www.cyberforum.ru/cpp-beginners/thread609977.html
Определить, попадает ли точка с заданными координатами в полукруг радиусом R, расположенный в I и II четверти. (Уравнение окружности R2=x2+y2.).
C++ operator= Такой вопрос. Есть объект. Хочу чтобы при присваивании его к чеслу выдавалось число. Например. class MyClass { short MyClass::operator=(const MyClass&My) {return 12;}; }; Main() { подробнее

Показать сообщение отдельно
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.06.2012, 09:49  [ТС]     Маска байта
Цитата Сообщение от Toshkarik Посмотреть сообщение
Но опять же не понятно, если у Вас есть эти самые "разные" форматы, в них ведь уже задана маска числом, и порядок цветов/альфы, зачем проверять?
Оттуда, что это стандартные маски для .bmp v 4. Правда переменный порядок компонент в спецификации не упомянут, как стандартная возможность. Но я хочу ещё и отойти от стандарта, сохранив лишь сам заголовок, варианты BitPetPixel и расширение файла, но запихав туда произвольные маски от 8-ми цветной (rgb111) до миллионов и даже миллиардов градаций синего, но приводить только при визуализации к rgba8888 путём отбрасывания младших бит цветности. И я сейчас решил несколько усложнить задачу: если не хватает битов определённого цвета, то недостающие биты заполняются не нолями, а копией самого младшего бита из уже имеющихся, тогда r=1, g=1, b=1 в rgb111 даст не серый, а белый. И только если маска определённого компонента обнулена, тогда весь байт подлежит дефолтному заполнению, для цветности это 0x00, а для альфы полная не прозрачность, вроде бы 0xFF.

Добавлено через 1 минуту
Цитата Сообщение от Toshkarik Посмотреть сообщение
FFC00000 - FF это восемь бит, все что ниже в маске усекается как я понял.
Да. FFC00000 принимается за FF000000.

Добавлено через 4 минуты
Цитата Сообщение от Toshkarik Посмотреть сообщение
Но откуда берутся данные о формате, что именно 8 бит, к примеру, на красный канал, Тарас так и не написал.
Выходной формат имеет по 8 бит на красный, зелёный, синий и альфу. На самом деле red не переменная, а поле
C++
1
Pixel->rgbRed
.

Добавлено через 14 минут
Цитата Сообщение от lazybiz Посмотреть сообщение
Что-то я не совсем понял почему должно получится 0xB8, поясни.
Код
Mask   =0000 0111 1100 0000 0000 0000 0000 0000
Color  =0101 1110 1111 0101 0101 1110 1101 0011
              110 11
, в результате всего 5 бит, я их дополнил до 1101 1000, что даёт D8. Ошибся при наборе. Но теперь задача несколько другая,
Код
Mask   =0000 0111 1100 0000 0000 0000 0000 0000
Color  =0101 1110 1111 0101 0101 1110 1101 0011
должно давать не 1101 1000=D8, а 1110 1111=EF, а
Код
Mask   =0000 0111 1100 0000 0000 0000 0000 0000
Color  =0101 1110 1011 0101 0101 1110 1101 0011
должно давать 1110 0000=D0. Выделение по маске даёт 1101 0 и дополняем нулевыми битами, а 1101 1 дополняется единичными.

Добавлено через 7 минут
При валидации массив разрашённых масок не использовать, так как их больше, чем бит в маске. Валидными считаются: 0b1111 1111 1111 1111 1111 1111 1111 1111, 0b0000 0000 0000 0000 0000 0000 0000 0000 и все маски, содержащие одновременно ноли и единицы в любом количестве, но не содержащие ноли между единицами. Если единицы есть, но их меньше 32-х, то они располагаться в начале маски, или в её конце, а если их меньше 31-й, то в начале, в конце и в любом месте в середине, но обязательно подряд.

Добавлено через 12 минут
Цитата Сообщение от lazybiz Посмотреть сообщение
Тут BitPerPixel=32 ? Если да, то R = 0xF5 & 0xC0 = 0xC0. Если же формат цвета RGB101010, тогда R = 0x5EF & 0xFFC = 0x5EC . В любом случае откуда 0x5E ?
BitPerPixel не может быть равен 30, а ближайшее разрешённое значение не меньше 30-ти 32, это формат rgb101010 с двумя не значащими битами на конце, усекаемый с учётом выходного формата rgba8888. По маске получаем 0b01011 11011, это 10 бит, а мне надо восемь, беру 8 старших и получаю 0b0101 1110=0x5E.

Добавлено через 1 минуту
В файле маска одна, она проходит валидацию и ни каких сообщений об ошибках не выводится, но вместо этой маски фактически подставляется другая.

Добавлено через 4 минуты
Но если в файле маска не 0b11111111110000000000000000000000=0xFFC00000, а 0b11111111010000000000000000000000=0xFF400000, то надо вывести сообщение об ошибке, такая маска не валидна, а вместе с ней не валиден весь файл.

Добавлено через 19 минут
Решить надо следующие подзадачи:
1. Дано 32-х битное число, надо определить позицию старшего единичного бита. Решить без использования массивов.
2. Дано 32-х битное число, надо определить позицию младшего единичного бита. Решить без использования массивов.
3. Дано 32-х битное число, надо проверить, образуют ли единичные биты непрерывную последовательность. Решить без использования массивов.
4. Даны 8-ми битное число и позиция бита, надо скопировать этот бит во все биты младше его. Допускается использовать массивы из 8-ми и 16-ти масок.
5. Дан указатель
C++
1
void *p;
, его значение указывает в массив за 3 байта до конца массива, адрес байта сразу за границей массива не валиден в адресном пространстве процесса, надо взять 3 байта по указателю и использовать их в поразрядной логической операции с 32-х битным вторым операндом с фактически нулевым младшим байтом. Есть вариант решения:
C++
1
2
3
4
5
6
7
8
uint8_t *p1;
uint8_t *p2;
uint32_t buffer;
for (p1=((uint8_t*)p)+3, p2=((uint8_t)&buffer)+3; p1>=(uint8_t*)p; --p1, --p2)
{
 *p2=*p1;
}
red=(uint8_t)((buffer&RedMask)>>n);
. Прошу критику, и предложения лучших вариантов, чем этот.

Добавлено через 6 минут
И прошу не строить домыслов о значениях не стандартных масок, так как заранее они не известны.

Добавлено через 34 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
4. Даны 8-ми битное число и позиция бита, надо скопировать этот бит во все биты младше его. Допускается использовать массивы из 8-ми и 16-ти масок.
Мой вариант:
C++
1
2
3
4
5
6
7
static uint8_t TestMasks      [8]= {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
static uint8_t Masks          [8]= {0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80};
static uint8_t CorrectMasks[2][8]={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
                                   {0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F}};
       bool    TestResult;
TestResult=(*Color&Testmask[bit])!=0x00;
*Color=((*Color)&Mask[bit])|CorrectMasks[TestResult][bit];
. Здесь число берётся по указателю. Прошу критику.
 
Текущее время: 00:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru