zoukankan      html  css  js  c++  java
  • (x&y) + ((x^y)>>1)即x和y的算数平均值

    (x&y) + ((x^y)>>1)相当于(x+y)/2

    (x&y)+((x^y)>>1),把x和y里对应的每一位(指二进制位)都分成三类,每一类分别计算平均值,最后汇总。

    其中,一类是x,y对应位都是1,用x&y计算其平均值;

    一类是x,y中对应位有且只有一位是1,用(x^y)>>1计算其平均值;

    还有一另是x,y中对应位均为0,无须计算。


    下面我再分别说明一下前两种情况是怎样计算的:
    x,y对应位均为1,相加后再除以2还是原来的数,如两个00001111相加后除以2仍得00001111,这是第一部分。

    第二部分,对应位有且只有一位为1,用“异或”运算提取出来,然后>>1(右移一位,相当于除以2),即到到第二部分的平均值。

    第三部分,对应位均为零,因为相加后再除以二还是0,所以不用计算。 三部分汇总之后就是(x&y)+((x^y)>>1)


    顺便解释一下前面说到可以避免溢出。

    假设x,y均为unsigned char型数据(0~255,占用一字节),显然,x,y的平均数也在0~255之间,但如果直接x+y可能会使结果大于255,这就产生溢出,虽然最终结果在255之内,但过程中需要额外处理溢出的那一位,在汇编中就需要考虑这种高位溢出的情况,如果(x&y)+((x^y)>>1)计算则不会。

  • 相关阅读:
    mongodb复制集搭建
    mongodb分片集群搭建
    mongodb安装、运行
    吉他“和弦”是什么?
    NoSQL 简介
    淘汰算法 LRU、LFU和FIFO
    Java遍历Map对象的四种方式
    终于搞懂了shell bash cmd...
    如何为openwrt生成补丁
    linux内核启动时报错ubi0 error: validate_ec_hdr: bad data offset 256, expected 128
  • 原文地址:https://www.cnblogs.com/zhanbiqiang/p/4009416.html
Copyright © 2011-2022 走看看