输入:一个整数[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/