2012-08-10 5 views
0

2 바이트가 있고 다른 조합을 얻기 위해 다른 비트를 설정하고 있습니다. 예 : 바이트 1 비트 7 및 바이트 2 비트 1, 비트 2는 조합 장치를 준비 상태로 만듭니다. 이제, 내가 만든 마스크는 16 진수로 2 비트를 더하는 방법

#define C1_device_ready (0x80 | 0x100 | 0x200) 

는 다음 나는 데이터를 읽고 비교하려고합니다. 1 바이트에 대해 을 사용할 수 있습니다 (데이터 [0] & 마스크 == 마스크). 그러나 데이터 [0] 및 데이터 [1]의 두 바이트가있는 C1_device_ready 마스크에 대해 어떻게 계산할 수 있습니까? 쉽게 가능합니까, 아니면 싱글 바이트로만 마스킹을해야합니까? :: 첨가 :: 데이터 부호 문자 데이터 [2] unsigned char 배열이다

답변

5

data 경우

if ((data[0] & mask) == (mask & 0xFF) && (data[1] & mask) == ((mask >> 8) & 0xFF)) 

테스트 또는 조합 두 data[i]를 체크 할 수있다

if (((data[0] | (data[1] << 8)) & mask) == mask) 
+0

감사합니다. 비트 이동 (<8)을 설명해주십시오. – user1566277

+0

'data [0] | (data [1] << 8)'는 최하위 바이트에'data [0]'을,'second'에'data [1]'을 갖는'data' 배열의 두 바이트를'int' 쉬프트 당 최하위 바이트. 비트 연산'<<'과'|'는 자동으로 정수 승격을 수행하기 때문에 더 큰 유형으로 수동으로 캐스트를 삽입 할 필요가 없습니다. –

+0

잘 설명합니다. 그러한 분명한 답변에 많은 감사드립니다. – user1566277

2

용도 :

if (((data[0] | (data[1] << 8)) & mask) == mask) { 
    // do something 
} 
2
((data[0] | (data[1]<<8)) & mask) == mask 

해야합니다. unsigned int

0

시도로 일을 캐스팅해야 할 수도 있습니다 작동

if ((*(short *)data) & C1_device_ready) 
+1

== 마스크를 추가해야합니다. – Gir