我正在研究C ++代码。不太确定下面的代码试图做什么。希望得到别人的帮助。
int pval = t_gamma[depth[i]];
int lb = pval & 0xff;
switch (pval>>8) {
case 0:
depth_mid[3*i+0] = 255;
depth_mid[3*i+1] = 255-lb;
depth_mid[3*i+2] = 255-lb;
break;
case 1:
depth_mid[3*i+0] = 255;
depth_mid[3*i+1] = lb;
depth_mid[3*i+2] = 0;
break;
case 2:
depth_mid[3*i+0] = 255-lb;
depth_mid[3*i+1] = 255;
depth_mid[3*i+2] = 0;
break;
case 3:
depth_mid[3*i+0] = 0;
depth_mid[3*i+1] = 255;
depth_mid[3*i+2] = lb;
break;
case 4:
depth_mid[3*i+0] = 0;
depth_mid[3*i+1] = 255-lb;
depth_mid[3*i+2] = 255;
break;
case 5:
depth_mid[3*i+0] = 0;
depth_mid[3*i+1] = 0;
depth_mid[3*i+2] = 255-lb;
break;
default:
depth_mid[3*i+0] = 0;
depth_mid[3*i+1] = 0;
depth_mid[3*i+2] = 0;
break;
}
答案 0 :(得分:10)
0xff
表示“十六进制数ff
” - 换句话说,整数255
,其具有二进制表示00000000000000000000000011111111
(当使用32位整数时) 。 &
运算符执行按位AND运算。 a & b
将为您提供一个整数,其位模式在0
具有b
的所有位置都有0
,而在b
所有的位置a 1
,使用来自a
的相应位值(这也是相反的)。例如,10110111
和00001101
的按位AND为00000101
。
在这种情况下,pval & 0xff
将为pval
提供最右边的8位。
至于代码的作用,我相信它会尝试将颜色值从特殊格式转换为标准RGB:颜色值似乎包含11位,其中三个指示颜色范围(例如,{{1似乎表示范围是“白色到蓝色”,而000
表示“红色到黄色”),最右边的8位表示此范围内的颜色。
答案 1 :(得分:1)
int lb = pval & 0xff;
此操作使用 0xff 对 pval 执行按位AND操作。
因为0xff在整数的低8位中表示为1,所以它实际上屏蔽了 pval ,因此它只留下最后8位的值。
因此,换句话说,它只是忽略整数值的所有其余部分,并进行简单的模256计算。但通常它只是用于检索最后一位。
答案 2 :(得分:1)
pval是一个int,但最低的8位有特殊含义,其余的位有另一个
3 1
1 6 8 0
+--------+--------+--------+--------+
pval = |aaaaaaaa|aaaaaaaa|aaaaaaaa|bbbbbbbb|
+--------+--------+--------+--------+
代码'int lb = pval& 0xff'只返回'b'位的值。
pval>> 8返回'a'位的值。
至于代码在做什么,在我看来,它正在将一些数据转换为颜色映射,以便可以显示它。但是,没有足够的信息可以确定。