社区
新手乐园
帖子详情
《程序员面试宝典》不懂问题一道~
guaner0203
2012-03-04 10:29:34
问题如下:
int f(int x,int y){
return (x&y)+((x^y)>>1);
}
作者的解释是:
X&Y是取相同的位与后的结果是X和Y相同位的一半,x^y是取x和y的不同位,右移相等于除以2,所以这个函数的功能是取两个数的平均值。
这话怎么理解?想不通啊~~
...全文
205
8
打赏
收藏
《程序员面试宝典》不懂问题一道~
问题如下: int f(int x,int y){ return (x&y)+((x^y)>>1); } 作者的解释是: X&Y是取相同的位与后的结果是X和Y相同位的一半,x^y是取x和y的不同位,右移相等于除以2,所以这个函数的功能是取两个数的平均值。 这话怎么理解?想不通啊~~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
guaner0203
2012-03-04
打赏
举报
回复
可是这句话
X&Y是取相同的位与后的结果是X和Y相同位的一半
单拿出来怎么理解呢?
guaner0203
2012-03-04
打赏
举报
回复
[Quote=引用 2 楼 czh3642210 的回复:]
LS括号看错了,引用楼上的测试
x=0001,y=0111(二进制的)
x&y = 0001
x^y = 0110 所以 (x^y)>>1 = 0011
所以
(x&y)+((x^y)>>1) = 0001 + 0011 = 0100
是正确的
[/Quote]
小弟初学者,听了你的解释明白了好多,但是还要再想一想 。
非常感谢~~
xxplili
2012-03-04
打赏
举报
回复
好巧妙的方法
前面的是进位,后面是相加除2。。。
其实就是
((x&y)<<1+(x^y))>>1
进位 + 与的结果 再除以2
这让我想起了数电课上的加法器
cao_julians
2012-03-04
打赏
举报
回复
[Quote=引用 1 楼 cao_julians 的回复:]
解释似乎不对,简单测试一下:
x=0001,y=0111(二进制的)
(x+y)/2=(0001+0111)/2=1000/2=0100
((x&y)+(x^y))>>1=((0001&0111)+(0001^0111))>>1=(0001+0110)>>1=(0111)>>1=0011
[/Quote]
我看走眼了,括号位置不对
第二的测试应该是
(x&y)+((x^y)>>1)=(0001&0111)+((0001^0111)>>1)=0001+(0110>>1)=0001+0011=0100
解释应该是对的。
x&y的结果是同为"1”的位被保留(在+运算中是要产生向高位进位的),它不右移事实上就是除非后的进位了
而x^y的结果实际上保留0+1或者1+0的结果(异或也称为按位加--不要进位),再右移1位即除以2,
综合起来就是
前一段是进位,后一段是本位和除以2,相加即是平均值
面包大师
2012-03-04
打赏
举报
回复
LS括号看错了,引用楼上的测试
x=0001,y=0111(二进制的)
x&y = 0001
x^y = 0110 所以 (x^y)>>1 = 0011
所以
(x&y)+((x^y)>>1) = 0001 + 0011 = 0100
是正确的
cao_julians
2012-03-04
打赏
举报
回复
解释似乎不对,简单测试一下:
x=0001,y=0111(二进制的)
(x+y)/2=(0001+0111)/2=1000/2=0100
((x&y)+(x^y))>>1=((0001&0111)+(0001^0111))>>1=(0001+0110)>>1=(0111)>>1=0011
东莞某某某
2012-03-04
打赏
举报
回复
这个算法不用太计较,知道就行,我还以为是精妙的数学方法推出的
cao_julians
2012-03-04
打赏
举报
回复
[Quote=引用 6 楼 guaner0203 的回复:]
可是这句话
X&Y是取相同的位与后的结果是X和Y相同位的一半
单拿出来怎么理解呢?
[/Quote]
那句话不严谨,只有1&1=1,推论是在这一位处1+1要产生进位。而0&0=0,和这个题目无关
程序员
面试宝典
第五版——学习记录
一、程序设计基本概念 1. 2. 如果取!已经跳出循环了,还会执行后面的++ 3. 4. 可以参考:https://blog.csdn.net/cnd2449294059/article/details/73913504 #include<iostream> #include<stdlib.h> #include<std...
程序员
面试宝典
3 种 考 试 笔 试,电话面试,面试,是顺利求职的 3 个过程。三关全过才能顺 利签约,只要有一关没能通过,就会被“刷”掉。 3.1 笔试 我认为笔试是
程序员
面试 3 个过程中最重要的一个环节,也是最难 以提升的一个环节。本书中主要叙述的也是
程序员
的笔试经历。不论你 有多么大的才干,多么广博的知识,如果未能通过笔试,则无缘下面的 进程。下面是一个表,描述
java
程序员
面试笔试宝典答案
前言 很久没有发过文章,今天来说一下应届生找工作的
问题
吧,就算你是打摆子都要看完~~ 金九银十是社招以及校招的火热时期,但今年很明显没有往年般的火热,面试也是越来越难了。对于应届生来说,如何能够在面试官眼中脱颖而出显得尤为重要。好在,我帮你们找到了一份非常全面的面试资料,针对于应届生以及转行过来的人群都是极具价值的,接下来就一起看看这份笔记。 一面 自我介绍 项目难度介绍 如何实现延时任务 如何实现限流 线程池的参数 能不能自己实现一个java.lang.String并加载 R
Java
面试宝典
Beta5.0
pdf下载地址:Java
面试宝典
第一章内容介绍 20 第二章JavaSE基础 21 一、Java面向对象 21 1. 面向对象都有哪些特性以及你对这些特性的理解 21 2. 访问权限修饰符public、private、protected, 以及不写(默认)时的区别(2017-11-12) 22 3. 如何理解clone对象 22 二、JavaSE语法(2017-11-12-wl) ...
程序员
面试题精选
程序员
面试题精选(01)-把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 比如将二元查找树 10 / /
新手乐园
33,311
社区成员
41,785
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章