2017-02-08 2 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

당신은 당신이 관심있는 값을 마스크 비트 AND 연산자 &를 사용합니다.

예를 들어, 파란색 비트가 당신이 jersey1 & BLUE을 말할 것입니다 설정되어 있는지 확인합니다. 값이 0이면 파란색 비트가 없습니다. 0이 아니면 파란색 비트가 설정됩니다.

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

'&는'나 '와'비트와 운영자가 모두 있어야합니다 :

0

당신은 청색 픽셀이 다음과 같은 jersey1에있는 경우 테스트 할 비트 '&'를 사용하는 것이 좋습니다 각 값 (BLUE 및 jersey1)의 동일한 위치에있는 비트는 1로 설정됩니다. 반면, '|' (또는) 연산자는 값 중 하나의 비트 세트 하나가 1 일 때만 필요합니다. 위의 예에서 "비트 또는"(|)을 사용 했습니까? if 문은 항상 true가되어 원하는 것과 다릅니다 .

0

비트 AND 및 OR 연산자는 값을 중지 (마스크 처리)하거나 통과시키는 게이트로 생각할 수 있습니다. 값과 마스크를 가져 와서 이진 표현을 비교하면 AND 연산자는 둘 다 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을 16 진수로 변환하여 0x0000007B을 얻은 다음 "파란색"위치에있는 값을 결정하는 마스크를 선택해야합니다. {사실, 우리는 이미 파란색 위치에 값이 있다는 것을 볼 수 있습니다. 따라서 이 될 수 있습니다 ...} 어쨌든 단순히 값을 파란 채널로 마스킹하려면 단순히 통과하는 마스크 만 사용해야합니다. 그 마지막 위치의 값들을 통해 FF의 16 진수 값은 11111111이고 값을 전달하는 값은 0000FF이며 마스크는 파란색 채널 (BLUE const)에 대한 마스크입니다. 채널에 파란색이 있는지 여부를 확인하는 것이 0이 아닌지 확인하려면 (jersey1 & BLUE) 값을 테스트해야합니다.

관련 문제