位运算求2个整数的平均值原理

cosobin 2009-06-11 02:45:40
求2个整数平均值,使用位运算不会溢出,高效,但不知道具体原理,哪位大虾解释一下,谢谢!
int avg=(x&y) +((x^y)>>1);
...全文
634 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
Paradin 2009-08-17
  • 打赏
  • 举报
回复
是不是理论上一个整数多项式表达式都可以替换为位运算表达式
fengzaihou 2009-08-17
  • 打赏
  • 举报
回复
这个算法不错,学习
fallening 2009-08-17
  • 打赏
  • 举报
回复
(x>>1) + (y>>1) + ((x&1)&(y&1))
daniao57 2009-08-17
  • 打赏
  • 举报
回复
int avg=(x >> 1) + (y >> 1) + (((x & 1) + (y & 1)) >> 1)
这样好像更好理解一些
wuyi8808 2009-08-16
  • 打赏
  • 举报
回复
如果是 Java,可以考虑用无符号右移运算符:

int avg = (x + y) >>> 1;
  • 打赏
  • 举报
回复
呵呵,也想到这个问题。
还有就是对于a+b这种这么简单的计算。
机器语言里的指令集里肯定是最好的实现了,
如果是楼主的实现,是,OK。
不是,说明还有更好的实现

[Quote=引用 30 楼 wuyi8808 的回复:]
如果是 Java,可以考虑用无符号右移运算符:

Java codeint avg= (x+ y)>>>1;
[/Quote]
  • 打赏
  • 举报
回复
1楼正解。
[Quote=引用 1 楼 oo 的回复:]
int avg=(x&y) +((x^y)>>1);

x&y 取出x和y二进制都为‘1’的所有位
x^y x和y中有一个为‘1’的所有位
(x^y)>>1 除以2


就是把x和y都分成两部分,
一部分是都为‘1’的部分,因为相同,所以直接加就行了
一部分是x为‘1’,y为‘0’的部分,以及y为’1‘,x为’0‘的部分,两部分加起来除以2,然后跟前面的相加就可以了
[/Quote]
linren 2009-08-14
  • 打赏
  • 举报
回复
【程序】
#include <stdio.h>

int main(){
int a,b,avg;
a=16;b=31;
avg=(a+b)>>1;
printf("%d\n",avg);

return 0;
}

【运行结果】
23
Press any key to continue

【说明】
“>>1”等同于“/2”……

下面的表达式:
int avg=(x&y) +((x^y)>>1);

一定没有avg=(a+b)/2;高效……
因为编译器会把“/2”翻译成“>>1”
只有2次运算
而那个表达式有4次运算……
Victor_Dinho 2009-08-14
  • 打赏
  • 举报
回复
mark
LPR_Pro 2009-08-14
  • 打赏
  • 举报
回复
好方法
yuanquxiaoxue 2009-08-09
  • 打赏
  • 举报
回复
knate 2009-06-30
  • 打赏
  • 举报
回复
高效算不上吧,现在的乘法基本都有专门的乘法器,速度和加法差不多.
ibone 2009-06-30
  • 打赏
  • 举报
回复
算法不错,学习!不过只能得到两者和是偶数的精确值,不能得到奇数的!
-------------------------
所以这个算法的意义是?
bfhtian 2009-06-29
  • 打赏
  • 举报
回复
mark
mmqmjy 2009-06-28
  • 打赏
  • 举报
回复
mark
daidodo 2009-06-26
  • 打赏
  • 举报
回复
mark
weiyzhang 2009-06-25
  • 打赏
  • 举报
回复
强打个标记
teacher1998 2009-06-16
  • 打赏
  • 举报
回复
学习
tfsict2008 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oo 的回复:]
int avg=(x&y) +((x^y)>>1);

x&y 取出x和y二进制都为‘1’的所有位
x^y x和y中有一个为‘1’的所有位
(x^y)>>1 除以2


就是把x和y都分成两部分,
一部分是都为‘1’的部分,因为相同,所以直接加就行了
一部分是x为‘1’,y为‘0’的部分,以及y为’1‘,x为’0‘的部分,两部分加起来除以2,然后跟前面的相加就可以了
[/Quote]

cow
liusichen_0 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oo 的回复:]
int avg=(x&y) +((x^y)>>1);

x&y 取出x和y二进制都为‘1’的所有位
x^y x和y中有一个为‘1’的所有位
(x^y)>>1 除以2


就是把x和y都分成两部分,
一部分是都为‘1’的部分,因为相同,所以直接加就行了
一部分是x为‘1’,y为‘0’的部分,以及y为’1‘,x为’0‘的部分,两部分加起来除以2,然后跟前面的相加就可以了
[/Quote]

强,收藏了
加载更多回复(15)

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧