相关疑难解决方法(0)

如何在C++中安全地平均两个无符号整数?

单独使用整数数学,我想在C++中"安全地"平均两个无符号整数.

我所说的"安全"是避免溢出(以及任何其他可以想到的).

例如,平均2005000很容易:

unsigned int a = 200;
unsigned int b = 5000;
unsigned int average = (a + b) / 2; // Equals: 2600 as intended
Run Code Online (Sandbox Code Playgroud)

但是在42949672955000的情况下:

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)

c++ math unsigned-integer

40
推荐指数
6
解决办法
1万
查看次数

取C中两个有符号数的平均值

让我们说我们有x和y,两者都是C中的有符号整数,我们如何找到两者之间最准确的平均值?

我更喜欢一种不利用任何机器/编译器/工具链特定工作的解决方案.

我提出的最好(a / 2) + (b / 2) + !!(a % 2) * !!(b %2)的解决方案是:有更准确的解决方案吗?快点?更简单?

如果我们知道一个是否比另一个先验大?

谢谢.

d


编者注:请注意,当输入值接近C int类型的最大绝对边界时,OP需要不受整数溢出影响的答案.这在原始问题中没有说明,但在给出答案时很重要.

c optimization average numerics

11
推荐指数
3
解决办法
3444
查看次数

标签 统计

average ×1

c ×1

c++ ×1

math ×1

numerics ×1

optimization ×1

unsigned-integer ×1