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

这种联合技巧可用于各种事情,例如将浮点值的位转换为具有相同位长的整数,例如用于执行按位运算和其他 hack。

于 2017-09-02T14:48:18.677 回答