2013-02-01 2 views
1

저는 두 개의 정수로 구성된 개별 비트로 작업합니다 (우분투 컴퓨터에서 컴파일하려면 g ++를 사용합니다).C++ 비트 연산

몇 가지 중간 단계에서, 나는

q = 11000000000000000000000000000000 
q_1 = 00000000000000000000000000000001 

지금은 Q 단위의 장소 여부를 확인하려는 등의 비트 표현을 가지고 동일하거나 둘은 q_1 있습니다. 그래서 if 조건에서 (*q)&1==q_1을 확인하고 잘 작동합니다.

하지만 q의 장소가 0이고 q_1의 위치가 1인지 확인하고 싶을 때 나는 ((*q)&1==0) && (q_1==1)을 수행해야한다고 생각했지만 예상대로 작동하지 않습니다. 디버깅을 위해 및 (q_1==1)의 값을 개별적으로 편집하고 1으로 인쇄되었습니다. 그러나 ((*q)&1==0) && (q_1==1)의 값은 0으로 인쇄됩니다. 이유가 무엇입니까?

* EDIT * 기능으로는, Q는 참조로 전달하고, 그래서이 값을 얻기 위해 * Q를 사용하고 .. C 및 C에서

+0

? * reference *로 전달 된 경우,'*'를 사용하지 않을 것입니다. – hyde

+1

이것은 최소한의 연구가 원인을 알려주는 고전적인 버그입니다. bitwise & == 연산자 우선 순위가 낮습니다. 일반적으로 연산자 우선 순위 규칙을 모두 잘 모르는 경우 괄호를 사용하십시오. – Lundin

+0

죄송 합니다만, 우선'(* q)'주위에 많은 괄호를 사용했습니다. 왜냐하면 우선 순위를 모르기 때문에 '&'의 피연산자가 모두 '1'이기 때문에 혼란스러워하고 여전히 출력으로 '0'을 얻었습니다 ... –

답변

11

++의 비트 & 운영자가 실제로보다 낮은 우선 순위를 가지고 등가 연산자 ==. 비트 연산자를 괄호로 묶어야합니다.

그래서 :

((*q)&1==0) && (q_1==1) 

가 있어야한다 : 당신 말은, 포인터로 전달 :

(((*q)&1)==0) && (q_1==1) 

참조 : EDIT 소개 http://en.cppreference.com/w/cpp/language/operator_precedence

+3

또한'(* q & 1) == 0 && q_1 == 1'로 충분할 것입니다. – ybungalobill