Целое число [0,4095] 12 битов к пучку {A, B, C} самый быстрый путь в c ++ - PullRequest
1 голос
/ 19 февраля 2012

Intput: целое число [0,4095] 12 бит.
Выход: связка {A, B, C} всех [0,255]

A, B, C задаются как 0 для255, где 255 соответствует 15 в 4 битах.Причина в том, что я хочу создать структуру Color, имеющую RGB, заданный от 0 до 255.

Я предполагаю, что решением будет что-то вроде сдвига битов ввода, чтобы извлечь 3 набора по 4 бита и затем умножить на 17 как255/15 | 15 = 1111 (двоичный)).

Как бы вы вычислили это быстрее всего?

мое собственное решение:

QColor mycolor(int value)
{
if(value > 0xFFF)
    value = 0xFFF;

int a=0,b=0,c=0;
a = (value & 0xF) * 17;
b = ((value&(0xF<<4))>>4) *17;
c = ((value&(0xF<<8))>>8) *17;
return QColor(c,b,a);
}



cv::Mat cv_image(10,10,CV_16U,cv::Scalar::all(1));
QImage image(cv_image.data, 10,10,QImage::Format_RGB444);
QPainter p(&image);
p.setPen(mycolor(255));
p.drawLine(0,0,9,0);
p.setPen(mycolor(4095));
p.drawLine(0,1,9,1);
p.setPen(mycolor(0));
p.drawLine(0,2,9,2);
p.setPen(mycolor(10000));
p.drawLine(0,3,9,3);


********* Start testing of Test1 *********
Config: Using QTest library 4.7.4, Qt 4.7.4
PASS   : Test1::initTestCase()
[255, 255, 255, 255, 255, 255, 255, 255, 255, 255;
  4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095;
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
  4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095;
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1;
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1;
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1;
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1;
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1;
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
PASS   : Test1::test1()

Ответы [ 3 ]

3 голосов
/ 19 февраля 2012

Прежде всего, ввод 0 ... 4096 на самом деле 12 бит, и это облегчает понимание вопроса.Вот одно из возможных решений:

int val; // 0...4096
int red =   ((val&(255<<8))>>8)*17;
int green = ((val&(255<<4))>>4)*17;
int blue =  ((val&(255<<0))>>0)*17;

Я сохранил сдвиг битов и для синего, чтобы вы могли заметить сходство в вычислениях.Надеюсь, это поможет.

1 голос
/ 19 февраля 2012

Вы можете использовать союзы для лучшего анализа 12-битного значения с цветовой кодировкой.

union colorCoding
{
  unsigned int val:12;
  struct
  {
    unsigned int red:4;
    unsigned int blue:4;
    unsigned int green:4;
  };
};
1 голос
/ 19 февраля 2012

Чтобы получить первые четыре бита от входа, вы можете AND сделать это с помощью 1111, затем сдвинуть бит на вход вправо на четыре бита и повторить процесс.Это дает вам три целых числа в диапазоне от 0 до 15.

Если затем вы хотите преобразовать это в нечто в [0,255], то сдвиньте все биты влево на четыре бита и OR это с 1111 (для простоты).

A = (input&15)<<4|15;
input >>= 4;
B = (input&15)<<4|15;
input >>= 4;
C = (input&15)<<4|15;

или (если вы хотите, чтобы 0 соответствовал 0)

A = input&15;
A = A<<4|A;
input >>= 4;
B = input&15;
B = B<<4|B;
input >>= 4;
C = input&15;
C = C<<4|C;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...