【发布时间】:2009-09-19 05:04:57
【问题描述】:
我有一个 Int64 值,但我只需要低 32 位。因此,我想要一种快速的方法来从 Int64 值的低 32 位获取 Int32 值。
谢谢
【问题讨论】:
-
这是什么语言?请添加正确的标签
-
我不明白如何在不懂语言的情况下回答这个问题。
标签: int64
我有一个 Int64 值,但我只需要低 32 位。因此,我想要一种快速的方法来从 Int64 值的低 32 位获取 Int32 值。
谢谢
【问题讨论】:
标签: int64
如果您将 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;
【讨论】:
做这样的事情:
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);
【讨论】:
yourLong & 0xFFFFFFFF00000000 或 yourLong & (~0ULL << 32),但要获得低位,只需要简单的赋值,因为顶部总是会被截断,编译器警告使用演员yourInt = (int)yourLong
您没有指定语言,但在许多情况下,您只需将其转换为 Int32。最高位将被丢弃。
【讨论】:
您可以让编译器处理字节序,并隐藏所有位移、指针操作等。
DWORD CUtility::ConvertUint64toUint32(unsigned __int64 in64){
ULARGE_INTEGER uli;
uli.QuadPart = in64;
return uli.LowPart;
}
【讨论】:
在 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;
}
这种联合技巧可以用于各种事情,例如将浮点值的位转换为相同位长的整数,例如用于进行按位运算和其他技巧。
【讨论】: