首页 > 编程知识 正文

算术左移相当于乘以2,算术右移相当于除以2,右移一位和除以2的区别

时间:2023-05-05 04:51:34 阅读:228709 作者:2209

右移位和除以2(C++) 起因

codeforces 1406D
(ans+d[1]+1)>>1 和 (s+a[0]+1)>>1 产生了完全不同的结果(Ac & Wa)

原因

对于正数,右移一位相当于除以2,但是负数却不同,

(-1>>1)==-1(-2>>1)==-1(-3>>1)==-2(-3>>1)==-2

正数右移高位补0,负数右移高位补1.由于负数存为对应正数的补码.
一个数和它的相反数,的前面各位相反,最后一位相同(0除外),则移除最后一位,两个数各位相反,则 ( a > > 1 ) + ( − a > > 1 ) + 1 = = 0 (a>>1)+(-a>>1)+1==0 (a>>1)+(−a>>1)+1==0,即 ( − a > > 1 ) = = − ( a > > 1 ) − 1 ( a ≠ 0 ) (-a>>1)==-(a>>1)-1 (aneq0) (−a>>1)==−(a>>1)−1(a​=0)

应用

x除以2并向下取整可以写为 ( x + 1 ) > > 1 (x+1)>>1 (x+1)>>1
x除以2并向上取整可以写为 ( ( x − 1 ) > > 1 ) + 1 ((x-1)>>1)+1 ((x−1)>>1)+1

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。