16

Int64 値がありますが、下位 32 ビットのみが必要です。したがって、Int64 値の下位 32 ビットから Int32 値を取得する簡単な方法が必要です。

ありがとう

4

5 に答える 5

32

int64 値を 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;
于 2009-09-19T06:08:59.760 に答える
10

次のようにします。

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 の上位半分を抽出します。

long tempLong = (int)(yourLong >> 32);
于 2009-09-19T05:11:30.953 に答える
9

言語を指定しませんでしたが、多くの場合、必要なのはそれを Int32 にキャストすることだけです。上位ビットは破棄されます。

于 2009-09-19T05:09:13.283 に答える
1

コンパイラにエンディアンを処理させ、すべてのビットシフト、ポインター操作などを非表示にすることができます。

DWORD CUtility::ConvertUint64toUint32(unsigned __int64 in64){
    ULARGE_INTEGER uli;
    uli.QuadPart = in64;
    return uli.LowPart;
}
于 2014-09-10T18:03:17.170 に答える
-3

C/C++ では、(私の意見では) 最善の方法は共用体を使用することです。たとえば、次の関数は無名共用体を使用して、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;
}

このユニオン トリックは、浮動小数点値のビットを同じビット長の整数に変換するなど、あらゆる種類の操作に使用できます。たとえば、ビット演算やその他のハックを行う場合などです。

于 2017-09-02T14:48:18.677 に答える