C++ 一个整数[04095]12位到一个桶{a,B,C}在C++;

C++ 一个整数[04095]12位到一个桶{a,B,C}在C++;,c++,qt,opencv,bit-manipulation,C++,Qt,Opencv,Bit Manipulation,输入:一个整数[04095]12位。 输出{A,B,C}all[0255]的一个tuble A、B、C表示为0到255,其中255映射到4位中的15。原因是我想构造一个颜色结构,其中RGB的定义范围为0到255 我假设解决方案类似于对输入进行位移位,以提取3组4位,然后乘以17作为(255/15 | 15=1111(二进制)) 你怎么计算这个最快的 我自己的解决方案: QColor mycolor(int value) { if(value > 0xFFF) value = 0xF

输入:一个整数[04095]12位。
输出{A,B,C}all[0255]的一个tuble

A、B、C表示为0到255,其中255映射到4位中的15。原因是我想构造一个颜色结构,其中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()
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;
QColor mycolor(int值)
{
如果(值>0xFFF)
值=0xFFF;
int a=0,b=0,c=0;
a=(值&0xF)*17;
b=((值和(0xF4)*17;
c=((值和(0xF8)*17;
返回QColor(c、b、a);
}
cv::Mat cv_图像(10,10,cv_16U,cv::Scalar::all(1));
QImage图像(cv_image.data,10,10,QImage::Format_RGB444);
QPainter p(和图像);
p、 setPen(mycolor(255));
p、 抽绳(0,0,9,0);
p、 setPen(mycolor(4095));
p、 抽绳(0,1,9,1);
p、 setPen(mycolor(0));
p、 抽绳(0,2,9,2);
p、 setPen(mycolor(10000));
p、 抽绳(0,3,9,3);
*********开始测试Test1*********
配置:使用QTest库4.7.4、Qt 4.7.4
通过: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]
通过:Test1::Test1()

首先,输入0…4096实际上是12位,这使问题更容易理解。下面是一个可能的解决方案:

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()
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;
int val;//0…4096
红色整数=((val&(2558)*17;
绿色整数=((val&(2554)*17;
蓝色整数=((val&(2550)*17;

我还保留了蓝色的位移位,以便您可以在计算中发现相似性。希望这有帮助。

首先,输入0…4096实际上是12位,这使问题更容易理解。下面是一个可能的解决方案:

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()
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;
int val;//0…4096
红色整数=((val&(2558)*17;
绿色整数=((val&(2554)*17;
蓝色整数=((val&(2550)*17;

我还保留了蓝色的位移位,以便您可以在计算中发现相似性。希望这有帮助。

要从输入中获取前四位,您可以
使用
1111
,然后将输入向右移位四位并重复此过程。这将获得0到15范围内的三个整数

如果要将其转换为[0255]中的内容,则将所有内容向左移位四位,然后使用
1111
将其转换为
1111
(为简单起见)

A=(输入&15)=4;
B=(输入&15)=4;

C=(input&15)要从输入中获取前四位,您可以使用
1111
将输入右移四位,然后重复该过程。这将获得0到15范围内的三个整数

如果要将其转换为[0255]中的内容,则将所有内容向左移位四位,然后使用
1111
将其转换为
1111
(为简单起见)

A=(输入&15)=4;
B=(输入&15)=4;

C=(input&15)您可以使用联合来更好地解析颜色编码的12位值

union colorCoding
{
  unsigned int val:12;
  struct
  {
    unsigned int red:4;
    unsigned int blue:4;
    unsigned int green:4;
  };
};

可以使用联合更好地解析颜色编码的12位值

union colorCoding
{
  unsigned int val:12;
  struct
  {
    unsigned int red:4;
    unsigned int blue:4;
    unsigned int green:4;
  };
};

测试是否有效:)看起来很好。必须弄清楚为什么要同时向右和向左移动。只是添加了我自己想出的,还没有测试是的,你也需要位向右移动,因为你计算val&111100000000,所以得到的结果将是00000000,红色值后有12个零。是的,对不起。它应该是0xf或15。测试是否有效:)看起来很好。必须弄清楚为什么要左右移动。只是添加了我自己想出的,还没有测试是的。你也需要位右移,因为你计算val&111100000000,所以得到的结果将是00000000,红色值后有12个零。是的,抱歉。它应该是0xf或15。谢谢。尽管我的列我们的实现是Qt中的QColor。我正在为CV_16U和Qt格式RGB444进行opencv Mat Qimage转换。虽然我不知道它在这种情况下的效果如何,但一般来说,联合不应该以这种方式使用。结构可以在成员变量之间添加任意填充,导致未定义的行为。谢谢。尽管我的颜色实现ation是Qt的QColor。我正在为CV_16U和Qt格式RGB444进行opencv Mat Qimage转换。虽然我不知道它在这种情况下工作得如何,但一般来说,不应该以这种方式使用并集。结构可以在成员变量之间添加任意填充,从而导致未定义的行为。