2013-09-07 6 views
2

오늘 : php5.3/Zend/Zend.h, 라인 코드를 거기 나를 혼란합니다.이다 그것은 "/ * 과부하 요소 데이터 유형 */#DEFINE OE_IS_ARRAY (1 << 0) #DEFINE OE_IS_OBJECT t (1 << 1) #DEFINE OE_IS_METHOD t (1 << 2)"에 무엇을 의미 하는가? 내가 디렉토리에 PHP는 커널 코드, 읽을 때

/* overloaded elements data types */ 
#define OE_IS_ARRAY  (1<<0) 
#define OE_IS_OBJECT (1<<1) 
#define OE_IS_METHOD (1<<2) 

는이 같은 의미인가 :

코드에 따라인가? 그리고 4 바이트를 가진 int 형을 사용합니다. 왼쪽 시프트 연산을 보여줍니다.

0000 0000 0000 0000 0000 0000 0000 0000 = 0 
After 1 << 
0000 0000 0000 0000 0000 0000 0000 0000 = 0 
___________________________________________ 

0000 0000 0000 0000 0000 0000 0000 0001 = 1 
After 1<< 
0000 0000 0000 0000 0000 0000 0000 0010 = 2 
___________________________________________ 

0000 0000 0000 0000 0000 0000 0000 0010 = 1 
After 1<< 
0000 0000 0000 0000 0000 0000 0000 0100 = 4 

그러나 그녀가/그는 이것이 왜 그냥 직접 CONST 변수를 할당 할 싶어?

/* overloaded elements data types */ 
#define OE_IS_ARRAY  (0)//turn the 1<<0 directly 
#define OE_IS_OBJECT (2)//turn the 1<<1 directly 
#define OE_IS_METHOD (4)//turn the 1<<2 directly 

내가 도와 주시면 감사하겠습니다. :)

+1

그것은 비트 마스크는 것을 시각화하는 단지입니다. – Hyperboreus

+1

비트 테이블을 수정하기 위해 방금 편집했습니다. 보세요. 1 << 0은 0이 아닌 1입니다. 0 비트로 임의의 값을 이동하면 혼자 남습니다. 또한 이러한 시프트 양은 비트 수 (어쨌든 낮은 비트 수의 기계에서)이기 때문에 외부 문서와 상수를 일치시킬 수도 있습니다. 이것은 하드웨어 및 비트의 포트 정의 비트 정의에 따라 더 많이 발생합니다. 미안 해요 –

+0

@MikeHousky, 난 당신이 더 명확하게 코드 예제와 그것을, 감사 : 매우 귀하의 상세 답변 – BeCurious

답변

5

이 보통이 모호 당신이 비트 플래그에 대해 얘기하고 있는지 확인하는 데 사용됩니다. 1, 2 및 4는 대부분의 프로그래머가 우리가 2의 거듭 제곱의 순서에 대해 말하고 있음을 깨닫게합니다. 모든 사람이 즉시 1 < < 14가 16384라는 것을 즉시 알 수있는 것은 아닙니다. 컴파일러가이 계산을 수행하므로 프로그램 속도가 느려지지 않습니다. 그것은 모두 선명도에 관한 것입니다.

그 소수점 상수보다 기본 이진 표현에 더 밀접하게 매핑하고 컴팩트 수 있기 때문에 당신은 때로는 16 진수로 작성이 일을 볼 수 있습니다.

+0

감사 할 수 있습니다, 당신이 말한 것을 이해하지 않는다! :) – BeCurious

관련 문제