c++ - 一个整数 [0,4095] 12 位元组 {A,B,C} 在 c++ 中最快的方法

标签 c++ qt opencv bit-manipulation

输入:一个整数[0,4095] 12bits。
输出:一管 {A,B,C} 都是 [0,255]

A、B、C 以 0 到 255 的形式给出,其中 255 映射到 4 位中的 15。原因是我想构建一个 Color 结构,其 RGB 定义为 0 到 255。

我假设解决方案类似于对输入进行位移以提取 3 组 4 位,然后乘以 17 为 (255/15 | 15 = 1111(binary))。

你如何计算这个最快?

我自己的解决方案:

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()

最佳答案

首先,输入 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;

我也保留了蓝色的位移位,因此您可以发现计算中的相似性。希望这会有所帮助。

关于c++ - 一个整数 [0,4095] 12 位元组 {A,B,C} 在 c++ 中最快的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9347924/

相关文章:

c++ - 如何检查 std 字符串中的位置是否存在? (c++)

c++ - 如何使用C++ API在HDF5文件中写入/读取锯齿状阵列?

c++ - C++中转义序列的数据类型

qt - 以编程方式验证 QLineEdit

c++ - QListView 中的独占复选框

python - 不支持的操作数类型 - : 'list' and 'int'

opencv - Opencv中的眼睛检测问题

c++ - Opencv << cout 和写入 FileStorage 的运算符错误

c++ - `-Wl,` 编译器标志前缀

c++ - Qt 图形被另一个遮挡,但仍然导致绘图更新