关于位运算的一些收集

     利用位运算往往能取得一些精妙的计算效果。这里收藏一些有关位运算的应用,底下的参考都是很棒的资料,每每思之,若有所得。

(1) 获取两个数字的平均数        

int getAverage(int a, int b)
{
    return (a&b)+((a^b)>>1);
}

      如果使用 (a+b)/2 可能需要考虑溢出。可以这样考虑: a&b 得到的是a与b之间相同的"部分", 相同的部分所代表的是其相同的一个“基数”,好比 5 = 4+1, 3= 2+1, 5与3之间相同的"基数"部分便是"1"。a^b 得到的是 a 与 b 不同的部分,这个不同的部分便是这两个数之间的"差距", 给这个“差距” 右移 1 位相当于给除以2。最后返回”基数“+”差距“的一半。

 

【参考资料】

1. Bit Twiddling Hacks

posted @ 2012-10-06 16:05  rereadyou  阅读(107)  评论(0编辑  收藏  举报