【问题标题】:I want to get the low 32 bit of a int64 as int32我想将 int64 的低 32 位作为 int32
【发布时间】:2009-09-19 05:04:57
【问题描述】:

我有一个 Int64 值,但我只需要低 32 位。因此,我想要一种快速的方法来从 Int64 值的低 32 位获取 Int32 值。

谢谢

【问题讨论】:

  • 这是什么语言?请添加正确的标签
  • 我不明白如何在不懂语言的情况下回答这个问题。

标签: int64


【解决方案1】:

如果您将 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;

【讨论】:

    【解决方案2】:

    做这样的事情:

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

    【讨论】:

    • 根据编译器在优化方面的能力,您的第一个代码示例可能比仅进行强制转换要慢得多。就我个人而言,我也不是特别清楚。
    • 将低 32 位清零,使用 yourLong &amp; 0xFFFFFFFF00000000yourLong &amp; (~0ULL &lt;&lt; 32),但要获得低位,只需要简单的赋值,因为顶部总是会被截断,编译器警告使用演员yourInt = (int)yourLong
    【解决方案3】:

    您没有指定语言,但在许多情况下,您只需将其转换为 Int32。最高位将被丢弃。

    【讨论】:

      【解决方案4】:

      您可以让编译器处理字节序,并隐藏所有位移、指针操作等。

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

      【讨论】:

      • 在您的代码前面添加 4 个空格,以便正确格式化。
      • 或者,选择您的代码块并按 Ctrl-K。
      • 您的意思是“ConvertUint64toUint32”吗?
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2022-08-04
        • 1970-01-01
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-24
        相关资源
        最近更新 更多