gpt4 book ai didi

c - C语言取两个有符号数的平均值

转载 作者:太空狗 更新时间:2023-10-29 16:44:29 26 4
gpt4 key购买 nike

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

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

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

如果我们先验地知道一个比另一个大怎么办?

谢谢。

D


编者注:请注意,当输入值接近 C int 类型的最大绝对界限时,OP 期望答案不会出现整数溢出。这一点在原始问题中没有说明,但在给出答案时很重要。

最佳答案

接受答案后(4 年)

我希望函数 int average_int(int a, int b) 能够:
1. 在 [INT_MIN..INT_MAX] 的整个范围内处理 ab 的所有组合。
2. 与 (a+b)/2 的结果相同,就好像使用更广泛的数学一样。

int2x存在,@Santiago Alessandri方法效果很好。

int avgSS(int a, int b) {
return (int) ( ((int2x) a + b) / 2);
}

否则 @AProgrammer 的变体:
注意:不需要更广泛的数学运算。

int avgC(int a, int b) {
if ((a < 0) == (b < 0)) { // a,b same sign
return a/2 + b/2 + (a%2 + b%2)/2;
}
return (a+b)/2;
}

A solution有更多测试,但没有 %

当未发生溢出时,以下所有解决方案都在 (a+b)/2 的 1 以内“有效”,但我希望找到与 (a+b) 匹配的解决方案/2 用于所有 int


@Santiago Alessandri只要 int 的范围小于 long long 的范围,解决方案就有效 - 通常是这种情况。

((long long)a + (long long)b) / 2

@AProgrammer ,已接受的答案,大约有 1/4 的时间无法匹配 (a+b)/2。示例输入,例如 a == 1, b == -2

a/2 + b/2 + (a%2 + b%2)/2

@Guy Sirton , 解决方案大约有 1/8 的时间无法匹配 (a+b)/2。示例输入,例如 a == 1, b == 0

int sgeq = ((a<0)==(b<0));
int avg = ((!sgeq)*(a+b)+sgeq*(b-a))/2 + sgeq*a;

@R.. , 解决方案大约有 1/4 的时间无法匹配 (a+b)/2。示例输入,例如 a == 1, b == 1

return (a-(a|b)+b)/2+(a|b)/2;

@MatthewD ,现在删除的解决方案大约有 5/6 的时间无法匹配 (a+b)/2。示例输入,例如 a == 1, b == -2

unsigned diff;
signed mean;
if (a > b) {
diff = a - b;
mean = b + (diff >> 1);
} else {
diff = b - a;
mean = a + (diff >> 1);
}

关于c - C语言取两个有符号数的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5697500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com