(x&y) + ( (x^y)>>1 )证明

对于位运算求两个数的平均值问题,(整形数据)
int  average(int x,int y)
{
return ( (x&y) + ( (x^y)>>1 ) );
}
给出两个整数,求出结果。
刚开始看到这道题的做法就是x和y转换为二进制,然后计算出结果。在没有办法的情况下这样做也可以得出结果。

跟你想象的一点不差,这里确实有捷径。

题目中的&和^都是位运算,所以我们有必要研究数据的对位情况。任何数据只有3中情况。
1) 0 与 0对应
2) 0 与 1对应
3)1 与 1对应
那么它们分别什么诀窍呢?
举例子来说:0101 和1101 也就是x和y分别为5、13.这两个数据出现了所谓的3种对应位情况。
我们可以把数据拆开来看: 5=0000+100+00+1
13=1000+100+00+1
他们分为为第一位,第二位,.....

当0和1对应时,x&y结果为0, x^y的结果呢?是不是就是x和y中那个对应位不为0的数据。
例如:上面数据的第四位0和1对位。此时x^y的结果就是1000.正是1101的第四位结果。
再右移一位,相当于除以2,所以当 0和1对位是原函数结果为 (x+y)/2;

在看1和1对应,1^1的结果为0,所以原函数后半部分不考虑,1&1结果为1,这也是(x+y)/2;
例如:第一位和第三位的对位,都为100,他们相与的结果和相加除以2相等,即x&y=(x+y)/2;

0与0对应的时候,无论怎么样都是0,即也符合(x+y)/2.

综合上述三种情况,我们可以知道其实原函数返回就是(x+y)/2。
可改写为:
return (x+y)/2;

这是程序员面试宝典中的一道题,我认为作者在书中的解释 (x&y)为x和y相同位的一半,这该怎么理解呢?我觉得这是一个错误解释。希望大家读书能有明辨的能力。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我们可以使用 Eisenstein 判别法来证明这两个多项式不可约。首先,我们注意到这两个多项式的系数都是 1 或 -1,所以它们的首项系数为 1。其次,我们设 p = 2,然后考虑将多项式看作关于 x-1 的多项式。我们做替换 x = y+1,得到如下形式的新多项式: f(y) = (y+1)^5 + (y+1)^4 + (y+1)^2 + (y+1) + 1 g(y) = (y+1)^5 + (y+1)^4 + (y+1)^3 + (y+1) + 1 现在我们需要证明存在一个质数 p,使得 p 整除 f(y) 的所有系数,但 p^2 不整除 f(y) 的首项系数 1,以及存在一个质数 q,使得 q 整除 g(y) 的所有系数,但 q^2 不整除 g(y) 的首项系数 1。 考虑 p = 2,我们有: f(y) = (y+1)^5 + (y+1)^4 + (y+1)^2 + (y+1) + 1 = y^5 + 5y^4 + 10y^3 + 10y^2 + 5y + 1 + y^4 + 4y^3 + 6y^2 + 4y + 1 + y^2 + 2y + 1 + y + 1 = y^5 + 6y^4 + 14y^3 + 16y^2 + 11y + 4 我们注意到所有系数都是偶数,除了首项系数为 1。因此,2 整除 f(y) 的所有系数,但 2^2 不整除 f(y) 的首项系数 1。 类似地,我们有: g(y) = (y+1)^5 + (y+1)^4 + (y+1)^3 + (y+1) + 1 = y^5 + 5y^4 + 10y^3 + 10y^2 + 5y + 1 + y^4 + 4y^3 + 6y^2 + 4y + 1 + y^3 + 3y^2 + 3y + 1 + y + 1 = y^5 + 6y^4 + 14y^3 + 15y^2 + 13y + 4 在这种情况下,我们注意到所有系数都是奇数,除了首项系数为 1。因此,存在一个质数 q,使得 q 整除 g(y) 的所有系数,但 q^2 不整除 g(y) 的首项系数 1。 因此,我们可以得出结论:x^5+x^4+x^2+x+1 和 x^5+x^4+x^3+x+1 都是不可约多项式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值