2017-02-08 62 views
-1

我想弄清楚jersey1是否有蓝色像素。另外,我使用按位运算符来找到它。为此,我应该使用按位还是(&)或按位或(|)。你能否向我解释他们彼此有什么不同?提前致谢。使用C++按位运算符查找匹配的颜色

const unsigned int GREEN= 0x0000FF00; //green 
const unsigned int RED = 0x00FF0000; //red 
const unsigned int BLUE = 0x000000FF; //blue 
const unsigned int RGB = RED | GREEN | BLUE; 

unsigned int jersey1 = 123; 

回答

2

您使用按位和运营商&掩盖值你有兴趣。

例如,要查看是否有蓝色位设置你会说jersey1 & BLUE。如果该值为0,则不存在蓝色位。如果它不是零,那么就会设置一个蓝色位。

0

你会希望使用位元“&”,以测试蓝色像素像下面jersey1存在:

if(jersey1 & BLUE) 
{ 
    cout << "It's blue!" << endl; 
} 
else 
{ 
    cout << "It's not blue!" << endl; 
} 

的“&”或“和”运营商与比特要求两个位于每个值(BLUE和jersey1)相同位置的位等于1,因此它为真。而''' (或)运算符只需要其中一个值中的一组位就等于1.在上面的例子中,如果你使用“按位或”(|),if语句永远是真的,这不是你想要的。

0

您可以将按位AND和OR运算符看作是停止值(将其屏蔽掉)或让它们通过的门。如果你取一个值和一个掩码,并比较它们的二进制表示,那么AND运算符将有一个1,它们都有一个1.任何至少其中一个有1的OR运算符将有一个1。此,读取垂直:

0 1 0 1 
0 0 1 1 
------- AND 
0 0 0 1 

0 1 0 1 
0 0 1 1 
------- OR 
0 1 1 1 

颜色由其中包含每个颜色的红,绿,和蓝分量的的256种可能的色调十六进制值频繁表示。这些字节(通常)是命令RRGGBB。因此,你应该将你的int 123转换为十六进制来得到0x0000007B,然后选择一个掩码,它将确定处于“蓝色”位置的值。 {事实上,我们已经可以看到在蓝色的位置上有一个值,所以我们现在停止 ...}无论如何,简单地将一个值遮蔽到它的蓝色通道,我们将与一个只通过通过最后一个位置的值。由于FF(十六进制)给出了11111111,并且其中的值通过,所以我们可以使用0000FF进行掩码,这是您为蓝色通道提供的掩码(BLUE常量)。您只需要测试(jersey1 & BLUE)的值,看看它是否为非零,以确定该频道中是否存在蓝色。