2009-06-17 3 views
1

이는 '< < 운영자의 역할이 무엇인가, 특히 이 C++ 매크로는 무엇을합니까?

#define Get64B(hi, lo) ((((__int64)(hi)) << 32) | (unsigned int)(lo)) 

MSVC

입니다? 당신의 도움이

+0

감사합니다. 이것이 코드에서 사용되는 방식은 대부분의 사람들이 말한 것처럼 2 개의 32 비트 숫자로 구성된 두 개의 숫자로 unqiue id를 만드는 것입니다. – fadini

답변

17

< <에 대한

덕분에 왼쪽 시프트 연산자입니다. 이 매크로는 첫 번째 인수를 상위 32 비트로 사용하고 두 번째 인수를 새 값의 하위 32 비트로 사용하여 두 개의 32 비트 값에서 64 비트 값을 생성합니다.

3

2 개의 32 비트 정수를 취하여 64 비트 정수를 반환하며 첫 번째 매개 변수는 32 개의 상위 비트로, 두 번째 매개 변수는 32 개의 하위 비트로 반환합니다.

< <은 왼쪽 시프트 연산자입니다. 상위 32 비트를 가져 와서 시프트 한 다음 그 결과를 하위 비트와 OR 처리합니다.

2

연산자 < <은 2 진 왼쪽 시프트 연산자입니다. int64 변수를 왼쪽으로 32 비트 씩 이동합니다.

0

비트는 hi의 값을 32 비트 왼쪽으로 시프트합니다. 좌측 시프트 연산자이고, (숫자 타입) 표준 의미

0

왼쪽

int a = 1; 
int b = a << 3; // b is now 1000 binary, 8 decimal 

코드는 두 개의 32 비트 값 중 64 비트 수를 생성 비트로 시프트된다.

2

AakashM이 정확합니다. 쉽게 할 수있다하는 것은 방법 개의 32 비트 INT를 이용하여 64 비트 int를 돌려

__int64 Get64B(__int32 hi, __int32 lo) { 
    __int64 combined = hi; 
    combined = combined << 32; // Shift the value 32 bits left. Combined 
           // now holds all of hi on the left 32 bits 
    combined = combined | lo; // Low 32 bits now equal to lo 
    return combined; 
} 
0

로 작성된 이해하기 위해, 하나의 디 하이 차수 바이트와 하위 바이트와 두번째로 사용된다.

안녕 < < 32 정수를 64 비트 정수의 상위 바이트로 변환합니다. 예 :

Get64B (11111111111111110000000000000000, 000000000000000011111111111111111)

복귀 11111111111111110000000000000000000000000000000011111111111111111

때문에 11111111111111110000000000000000 개 < < 32 반환

1111111111111111000000000000000000000000000000000000000000000000

-1

복귀 8,16,32 개의 64 비트 정수 또는 64 비트 정수 다음과 같이 안전합니다. 안녕 < < 32 | lo

+0

먼저 64 비트 int로 캐스팅하지 않고 하이 비트를 32 비트 씩 이동하면 오버플로가 발생합니다. –

+0

이것은 정확히 내가 설명하는 것입니다. 먼저 hi를 64 비트로 변환해야합니다. 이것은 (__int64) hi에 의해 수행됩니다. 쓰는 것이 안전하지 않습니다. h << 32 | 봐라. hi 및 lo가 "unsigned char", "unsigned short"또는 "unsigned"인 경우 매크로는 "(__int64) hi << 32 | lo"로 단순화 할 수 있습니다. – bill