单独使用整数数学,我想在C++中"安全地"平均两个无符号整数.
我所说的"安全"是避免溢出(以及任何其他可以想到的).
例如,平均200和5000很容易:
unsigned int a = 200;
unsigned int b = 5000;
unsigned int average = (a + b) / 2; // Equals: 2600 as intended
Run Code Online (Sandbox Code Playgroud)
但是在4294967295和5000的情况下:
unsigned int a = 4294967295;
unsigned int b = 5000;
unsigned int average = (a + b) / 2; // Equals: 2499 instead of 2147486147
Run Code Online (Sandbox Code Playgroud)
我提出的最好的是:
unsigned int a = 4294967295;
unsigned int b = 5000;
unsigned int average = (a / 2) + …Run Code Online (Sandbox Code Playgroud) 让我们说我们有x和y,两者都是C中的有符号整数,我们如何找到两者之间最准确的平均值?
我更喜欢一种不利用任何机器/编译器/工具链特定工作的解决方案.
我提出的最好(a / 2) + (b / 2) + !!(a % 2) * !!(b %2)的解决方案是:有更准确的解决方案吗?快点?更简单?
如果我们知道一个是否比另一个先验大?
谢谢.
d
编者注:请注意,当输入值接近C int类型的最大绝对边界时,OP需要不受整数溢出影响的答案.这在原始问题中没有说明,但在给出答案时很重要.