余りの問題を解決する為に LSBが片方だけ1の時だけ事前に各LSBゼロにしておくというのがセオリー

論理演算でやるなら
888なら mask=(not ((a xor b) and $010101)) とマスクビットを用意して

return ( (mask and a)+(mask and b) )>>1;