2009-09-19 3 views
8

私はInt64値を持っていますが、下位32ビットしか必要ありません。したがって、私はInt32値の下位32ビットからInt32値を取得する簡単な方法が必要です。私はint32としてint64の下位32ビットを取得したい

おかげ

+4

どの言語がこれですか?正しいタグを追加してください –

+1

言語を知らなくても誰でもこの質問に答えることができません。 – pseudocoder

答えて

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

をこれはそれを行うための最もコンパクトな方法ではないかもしれないが、私にとって最も読みやすいように思われます。 次のコードは、長いの高い半分を抽出します:

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

コンパイラの最適化の程度によっては、最初のコードサンプルがキャストよりもかなり遅くなることがあります。個人的には、それも特に明確ではありません。 –

+1

は、低い32ビットをゼロにするために、 'yourLong&0xFFFFFFFF00000000'または' yourLong&(〜0ULL << 32) 'を使用しますが、下位ビットを得るためには、トップが常に切り詰められるので、コンパイラはキャストの使用を警告します。 'yourInt =(int)yourLong' –

9

あなたは言語を指定していないが、多くに、あなたがする必要があるすべてはのInt32にキャストしています。最上位ビットは破棄されます。

24

あなたはint32型の値にInt64の値を割り当てた場合、コンパイラが自動的に(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; 
} 

ビット単位の操作やその他のハッキングを行うためのものです。

関連する問題