首页  >  文章  >  后端开发  >  如何在 C 中获得 64 位整数乘法的上半部分?

如何在 C 中获得 64 位整数乘法的上半部分?

Susan Sarandon
Susan Sarandon原创
2024-11-16 11:30:04513浏览

How to Get the Upper Half of a 64-bit Integer Multiplication in C  ?

获取 64 位整数乘法的上半部分

在 C 中,两个 64 位整数 (uint64_t) 的乘法结果为表示乘积的低 64 位的值,即 (i * j) mod (2^64)。要获取高 64 位,可以采用多种方法。

使用 128 位数字

如果您的编译器支持 128 位整数 (__uint128_t),则最有效的方法是使用 128 位算术执行乘法并提取高 64 位。

64 位算术的可移植方法

对于不支持的编译器对于 128 位数字,一种可移植的解决方案是将每个 64 位整数拆分为两个 32 位的一半,然后使用 64 位乘法将它们相乘。然后将上半部分和下半部分组合起来计算完整的 128 位乘积。

但是,在使用 64 位算术时,此计算可能会导致溢出。下面的代码提供了一个在计算高 64 位时处理溢出的实现:

uint64_t mulhi(uint64_t a, uint64_t b) {
    uint64_t    a_lo = (uint32_t)a;
    uint64_t    a_hi = a >> 32;
    uint64_t    b_lo = (uint32_t)b;
    uint64_t    b_hi = b >> 32;

    uint64_t    a_x_b_hi =  a_hi * b_hi;
    uint64_t    a_x_b_mid = a_hi * b_lo;
    uint64_t    b_x_a_mid = b_hi * a_lo;
    uint64_t    a_x_b_lo =  a_lo * b_lo;

    uint64_t    carry_bit = ((uint64_t)(uint32_t)a_x_b_mid +
                             (uint64_t)(uint32_t)b_x_a_mid +
                             (a_x_b_lo >> 32) ) >> 32;

    uint64_t    multhi = a_x_b_hi +
                         (a_x_b_mid >> 32) + (b_x_a_mid >> 32) +
                         carry_bit;

    return multhi;
}

请注意,省略进位位的计算将导致高 64 位值可能偏离 1。

以上是如何在 C 中获得 64 位整数乘法的上半部分?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn