저는 Int64 값을 가지고 있지만 하위 32 비트 만 필요합니다. 따라서 Int32 값의 하위 32 비트에서 Int32 값을 얻는 빠른 방법이 필요합니다.내가 int32로 int64의 하위 32 비트를 가져오고 싶습니다
감사
저는 Int64 값을 가지고 있지만 하위 32 비트 만 필요합니다. 따라서 Int32 값의 하위 32 비트에서 Int32 값을 얻는 빠른 방법이 필요합니다.내가 int32로 int64의 하위 32 비트를 가져오고 싶습니다
감사
어떻게 좀은 :
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);
컴파일러의 최적화 정도에 따라 첫 번째 코드 샘플이 캐스팅보다 훨씬 느릴 수 있습니다. 개인적으로, 나는 그것도 특히 명확하지 않습니다. –
은 낮은 32 비트를 제로화하기 위해'yourLong & 0xFFFFFFFF00000000' 또는'yourLong & (~ 0ULL << 32)'를 사용하지만, 낮은 비트를 얻기 위해서 상단이 항상 잘려지기 때문에 간단한 할당 만 필요합니다. 컴파일러는 캐스트를 사용하도록 경고합니다.'yourInt = (int) yourLong' –
당신은 언어를 지정하지 않았지만, 많은, 당신이 할 필요가 INT32에 캐스팅이다. 최상위 비트는 무시됩니다. 이 같은
를, 컴파일러는 자동으로
(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;
모든 비트 이동, 포인터 조작을 숨길 수 있도록하는 것은 노동 조합을 사용하는 것입니다. 예를 들어 다음 함수는 익명 공용체를 사용하여 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;
}
이 노조 트릭
같은 비트 수, 예를 들어, 정수로 부동 소수점 값의 비트를 받고 같은 것들의 모든 종류에 사용할 수 있습니다 비트 연산 및 기타 해킹을 수행하기위한 것입니다.
어떤 언어입니까? 올바른 태그를 추가하십시오. –
언어를 몰라도이 질문에 어떻게 답할 수 있는지 이해할 수 없습니다. – pseudocoder