2009-09-19 2 views

답변

5

어떻게 좀은 :

long tempLong = ((yourLong >> 32) << 32); //shift it right then left 32 bits, which zeroes the lower half of the long 
int yourInt = (int)(yourLong - tempLong); 

이 할 수있는 가장 컴팩트 한 방법이되지 않을 수도 있습니다,하지만 나에게 가장 읽을 것 같다. 다음 코드는 긴의 높은 반 추출합니다 : 당신이 Int32 값에 Int64 값을 할당하면

long tempLong = (int)(yourLong >> 32); 
+7

컴파일러의 최적화 정도에 따라 첫 번째 코드 샘플이 캐스팅보다 훨씬 느릴 수 있습니다. 개인적으로, 나는 그것도 특히 명확하지 않습니다. –

+1

은 낮은 32 비트를 제로화하기 위해'yourLong & 0xFFFFFFFF00000000' 또는'yourLong & (~ 0ULL << 32)'를 사용하지만, 낮은 비트를 얻기 위해서 상단이 항상 잘려지기 때문에 간단한 할당 만 필요합니다. 컴파일러는 캐스트를 사용하도록 경고합니다.'yourInt = (int) yourLong' –

9

당신은 언어를 지정하지 않았지만, 많은, 당신이 할 필요가 INT32에 캐스팅이다. 최상위 비트는 무시됩니다. 이 같은

24

를, 컴파일러는 자동으로
(Steven Sudit로 언급)을 위해 그렇게 할 것입니다 :

int64 val64 = ...; 
int32 val32 = ...; 
... 

val32 = val64; // get the low 32 bits 
// or 
val32 = (val64 >> 32); // get the high 32 bits 

와 컴파일러가 경고를 표시 할 수 있기 때문에 당신은 캐스트를 지정할 수 있습니다

val32 = (int32)val64; 
1

당신은 할 수 컴파일러는 엔디안을 처리하고 (내 생각에) 등 C/C++ 최선의 방법으로

DWORD CUtility::ConvertUint64toUint32(unsigned __int64 in64){ 
    ULARGE_INTEGER uli; 
    uli.QuadPart = in64; 
    return uli.LowPart; 
} 
+0

코드 앞에 4 칸 추가하여 올바른 형식으로 만듭니다. – DanM7

+0

또는 코드 블록을 선택하고 Ctrl-K를 누릅니다. – SiKing

+0

"ConvertUint64toUint32"를 원하셨습니까? – Quest

-1

모든 비트 이동, 포인터 조작을 숨길 수 있도록하는 것은 노동 조합을 사용하는 것입니다. 예를 들어 다음 함수는 익명 공용체를 사용하여 64 비트 정수에서 하위 32 비트를 추출합니다.

uint32_t lower_32_bits(uint64_t value) { 
    union { uint64_t value; struct { uint32_t high, low; }; } converter; 
    converter.value = value; 
    return converter.low; 
} 

이 노조 트릭

같은 비트 수, 예를 들어, 정수로 부동 소수점 값의 비트를 받고 같은 것들의 모든 종류에 사용할 수 있습니다 비트 연산 및 기타 해킹을 수행하기위한 것입니다.

관련 문제