2009-09-19 15 views
8

gibi bir Int64 düşük 32 bit almak istiyorum, ama sadece alt 32 bit gerekir. Bu nedenle Int32 değerini Int64 değerinin 32 bitinden almanın hızlı bir yolunu istiyorum.Ben bir Int64 değeri int32

Teşekkür

+4

Bu hangi bir dildir? lütfen doğru etiketi ekleyin –

+1

Ben kimsenin dili bilmeden bu soruya nasıl cevap vereceğini anlamıyorum. – pseudocoder

cevap

5

Do şey:

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); 

Bunu yapmanın en kompakt yol olmayabilir, ama bana en okunabilir gibi görünüyor. Aşağıdaki kod uzun yüksek yarısını çıkartacaktır: Bir int32 değerine bir int64 değeri atarsanız

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

Derleyicinin en iyi duruma getirme şekline bağlı olarak, ilk kod örneğiniz yalnızca dökümden daha yavaş olabilir. Şahsen ben de özellikle bulamadım. –

+1

, düşük 32 bit üzerinden sıfır 'kullanımı yourLong ve 0xFFFFFFFF00000000' veya to yourLong ve (~ 0ULL << 32) ', üst tarafı her zaman kesilir, çünkü düşük bit almak için, sadece basit bir atama gereklidir, bu derleyici, kullanmanız için uyarır 'yourInt = (int) yourLong' –

9

Sen dili belirtmedi, ancak birçok yer, yapmanız gereken tüm bir ınt32 için döküm olduğunu. Üst bitler atılacaktır. Böyle

24

, derleyici otomatik
(Steven Sudit olarak bahsedilen) için yapacak:

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

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

ve derleyici uyarıları gösterebilir çünkü döküm belirtebilirsiniz

val32 = (int32)val64; 
1

Yapabilirsin derleyici endian-lik idare ve (Bence) vb C/C++ en iyi şekilde

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

Kodunuzun önüne 4 boşluk ekleyerek düzgün şekilde biçimlendirin. – DanM7

+0

Veya kodunuzun bloğunu seçin ve Ctrl-K'ye basın. – SiKing

+0

Bunu mu demek istediniz: "ConvertUint64toUint32"? – Quest

-1

tüm bit kaydırma, işaretçi manipülasyon saklayalım bir birlik kullanmaktır. Örneğin, aşağıdaki işlev, 64 bitlik bir tam sayıdan alt sıra 32 bitlerini ayıklamak için bir anonim birleşim kullanır.

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

Bu birlik hüner

aynı bitlength, örneğin bir tamsayı içine kayan nokta değeri bit alma gibi her türlü şeyi kullanılabilir bitly işlemleri ve diğer hack yapmak için.