关闭

位操作(一)

163人阅读 评论(0) 收藏 举报
分类:

int hjdfunc(int nX, int nY)

{

    return(nX&nY+((nX^nY)>>1)));

}

问:hjdfunc(50, 70)返回多少?

不能用笨办法,把50、70转成2进制。

(nX+nY)/2,可以考虑成:

(1)两个2进制数先把都是‘1’的位相加再除以2;

(2)把不同的位上相加,即‘0’对应‘1’,然后再除以2;

(3)前两部分相加,得到结果。

nX&nY,实际上是把50、70的2进制形式里,相同的‘1’加起来后除以2,因为两个'1'变成了1个’1‘。例如:0100 & 1100,得到0100,其中第3位2个‘1’得到1一个‘1’。

nX^nY,按位异或,即把两个2进制数,按位不相同的部分相加了,再右移一位,相当于除以2。

综合起来,两部分加就是(nX+nY)/2。好处是不会溢出。例如两个整数相加,尽管平均值不超界,但是先求和,有可能超界。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9614次
    • 积分:398
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条