关于位运算的一些收集
利用位运算往往能取得一些精妙的计算效果。这里收藏一些有关位运算的应用,底下的参考都是很棒的资料,每每思之,若有所得。
(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。最后返回”基数“+”差距“的一半。
【参考资料】