【问题标题】:Need to do 64 bit multiplication on a machine with 32 bit longs需要在 32 位长的机器上做 64 位乘法
【发布时间】:2011-09-04 03:17:09
【问题描述】:

我正在开发一个具有 32 位长整数的小型嵌入式系统。对于一项计算,我需要以毫秒为单位输出自 1970 年以来的时间。自 1970 年以来,我可以得到 32 位无符号长秒的时间,但我如何将其表示为 64 位不。如果我最大的 int 只有 32 位?我相信stackoverflow会有一个狡猾的答案!我正在使用接近标准 C 的动态 C。我有一些来自另一个系统的示例代码,该系统具有 64 位长的长数据类型:

long long T = (long long)(SampleTime * 1000.0 + 0.5);
data.TimeLower = (unsigned int)(T & 0xffffffff);
data.TimeUpper = (unsigned short)((T >> 32) & 0xffff);

【问题讨论】:

  • 您使用什么语言?
  • 它是动态 C,一个用于嵌入式系统的 C 的古怪超集

标签: 64-bit integer 32-bit multiplication


【解决方案1】:

由于您只乘以 1000(秒 -> 毫秒),因此您可以使用两个 16 位 mutliplies 和一个添加和一些位摆弄来完成,我使用您假定的数据类型来存储以下结果:

uint32_t time32 = time();
uint32_t t1 = (time32 & 0xffff) * 1000;
uint32_t t2 = ((time32 >> 16) * 1000) + (t1 >> 16);
data.TimeLower = (uint32_t) ((t2 & 0xffff) << 16) | (t1 & 0xffff);
data.TimeUpper = (uint32_t) (t2 >> 16);

【讨论】:

    【解决方案2】:

    如果您能更具体地了解需要进行哪些计算,这可能会有所帮助。使用 32 位运算实现的 64 位乘法非常慢,并且您可能需要额外的 64 位除法开销(转换回秒和毫秒),这甚至更慢。

    如果不知道您究竟需要做什么,在我看来,使用结构会更有效,其中包含一个 32 位无符号整数表示秒数,一个 16 位整数表示数字毫秒(“剩余”)。 (如果 64 位对齐比节省几个字节更重要,则使用 32 位 int 表示毫秒。)

    【讨论】:

    • 我添加了一些来自另一个系统的示例代码,该系统具有 64 位 long long 类型
    【解决方案3】:

    假设您有可用的 16x16->32 乘法,标准方法是将两个数字分成 16 位高位和低位部分,计算四个部分乘积,然后将结果相加。但是,如果您没有比 32x32->32 原语更快的 16x16->32 原语,我不确定最好的方法是什么。我认为 32x32->32 乘法应该比 16x16->32 更有用,但我想不出如何使用它。

    就我个人而言,我希望有一个标准的原语来返回 NxN 乘法的上半部分(当然是 32x32;对于较小的机器也是 16x16,对于较大的机器是 64x64)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 2011-04-09
      相关资源
      最近更新 更多