求助,这个代码是什么意思?

yangfan876 2013-05-03 10:12:02
大家好,这里是维基百科上面归并排序递归的代码,
void merge_sort(int array[], unsigned int first, unsigned int last)
{
int mid = 0;
if(first<last)
{
/*mid = (first+last)/2;*/ /*注意防止溢出*/
/*mid = first/2 + last/2;*/
/*mid = ((first & last) + (first ^ last) >> 1);*/
mid = ((first & last) + ((first ^ last) >> 1)); /*修正上一句优先级错误*/
merge_sort(array, first, mid);
merge_sort(array, mid+1,last);
merge(array,first,mid,last);
}
}

大家看看前面注释掉的代码,第一句是会产生溢出,可以理解,但是第二句应该是可以解决溢出的问题的,那么位运算的那句(未被注释的),要怎么理解?我对位运算很不感冒,求大神指教....
...全文
170 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
N_Sev7 2013-05-06
  • 打赏
  • 举报
回复
看错,是异或 0111 ^ 0101 = 0010 (0010 >> 1) = 0001 0101 + 0001 = 0110 我去
N_Sev7 2013-05-06
  • 打赏
  • 举报
回复
0111 7 0111 7 &0101 5 ^0101 5 ------ -------- 0101 5 0111 7 0101 5 +0111 7 ------ 1100 12 1100>>1 右移1位(相当于除以2)结果:6 6是5和7之间的mid
N_Sev7 2013-05-06
  • 打赏
  • 举报
回复

mid = ((first & last) + ((first ^ last) >> 1));    /*用为运算进求两个数的平均数*/
自己动手算一下就知道了
yangfan876 2013-05-06
  • 打赏
  • 举报
回复
引用 6 楼 N_sev7 的回复:
看错,是异或 0111 ^ 0101 = 0010 (0010 >> 1) = 0001 0101 + 0001 = 0110 我去
恩恩...晓得了这个代码的功能,它同样不会产生溢出,那么这句相对于mid = first/2 + last/2;这句的优势是什么呢?
lh-pch 2013-05-05
  • 打赏
  • 举报
回复
看不懂,帮不了你!
就是那个党伟 2013-05-03
  • 打赏
  • 举报
回复

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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