关于0xff的问题

时间:2011-07-30 13:19:58

标签: c++

我正在研究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;
        }

3 个答案:

答案 0 :(得分:10)

0xff表示“十六进制数ff” - 换句话说,整数255,其具有二进制表示00000000000000000000000011111111(当使用32位整数时) 。 &运算符执行按位AND运算。 a & b将为您提供一个整数,其位模式在0具有b的所有位置都有0,而在b所有的位置a 1,使用来自a的相应位值(这也是相反的)。例如,1011011100001101的按位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'位的值。

至于代码在做什么,在我看来,它正在将一些数据转换为颜色映射,以便可以显示它。但是,没有足够的信息可以确定。