如何在不使用ULLONG_MAX
的情况下将常数2 ^ 64(即uint64
+ 1)除以unit128
大于2?
换句话说,给定x
,例如2 <= x <= 2^64-1
,如何仅使用2^64 / x
来获取商uint64
?
问题在于我不能代表2 ^ 64,更不用说将它分开了所以我希望有一个可以模拟结果的技巧。
答案 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);
}