右移一位就是 floor(n/2)
所以有 (x+y) shr 1 = floor((x+y)/2)
但这样可能溢出。
逻辑异或就是不进位加:
0^0 = 0
1^0 = 1
1^1 = 0
而逻辑与可以找出进位,所以有:
x+y = (x&y) shl 1 + (x^y)
两边右移一位:
(x+y) shr 1 = ((x&y) shl 1 + (x^y)) shr 1
因为 (x&y) shl 1 是左移来的最后一位肯定是 0, 相加后这一位不会进位,所以右移一位可以分配进去:
(x+y) shr 1 = (x&y) + (x^y) shr 1
这样,由于 (x^y) shr 1 是右移来的,最高位是 0, 所以不会溢出。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。