分子与分子2 ^ 64

时间:2017-10-31 18:18:01

标签: math division integer-division integer-arithmetic

如何在不使用ULLONG_MAX的情况下将常数2 ^ 64(即uint64 + 1)除以unit128大于2?

换句话说,给定x,例如2 <= x <= 2^64-1,如何仅使用2^64 / x来获取商uint64

问题在于我不能代表2 ^ 64,更不用说将它分开了所以我希望有一个可以模拟结果的技巧。

2 个答案:

答案 0 :(得分:2)

  

如何将常数2 ^ 64(即ULLONG_MAX + 1)除以大于2的uint64

a / b - &gt; (a-b)/ b + 1

首先从(max _value + 1)中减去x,然后除以x,再加1。

// C solution:
uint64_t foo(uint64_t x) {
  return (0u - x)/x + 1; // max_value + 1 is 0 and unsigned subtraction wraps around.
}

当然除以0是禁忌。代码适用于x >= 2,但不适用于x == 1,因为商也无法代表。

答案 1 :(得分:1)

选择ULLONG_MAX / denom,如果denom是2的幂,则加1。伪代码:

if (denom == 0) {
    throw ZeroDivisionException;
} else if (denom == 1) {
    throw OverflowException;
} else {
    return ULLONG_MAX / denom + (denom & (denom-1) == 0);
}

或者,将ULLONG_MAX / denom用于奇数denom,将2^63 / (denom / 2)用于偶数denom

if (denom == 0) {
    throw ZeroDivisionException;
} else if (denom == 1) {
    throw OverflowException;
} else if (denom & 1) {
    return ULLONG_MAX / denom;
} else {
    return (1ULL << 63) / (denom >> 1);
}