简而言之,(高低)>>> 1是使用未使用的符号位来执行非负数的正确平均值的技巧。
假设高低都是非负的,我们知道最高位(符号位)为零。
所以高和低都是31位整数。
high = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824
low = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824
当您将它们添加在一起时,他们可能会“溢出”到顶部位置。
high + low = 1000 0000 0000 0000 0000 0000 0000 0000
= 2147483648 as unsigned 32-bit integer
= -2147483648 as signed 32-bit integer
(high + low) / 2 = 1100 0000 0000 0000 0000 0000 0000 0000 = -1073741824
(high + low) >>> 1 = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824
>作为一个有符号的32位整数,它是溢出并且翻转为负数。因此(高低)/ 2是错误的,因为高低可能是负的。
>作为无符号的32位整数,总和是正确的。所需要的是将其除以2。
当然,Java不支持无符号整数,所以我们必须除以2(作为无符号整数)的最好的事情是逻辑右移>>>。
在具有无符号整数(如C和C)的语言中,它变得更加棘手,因为您的输入可以是32位整数。一个解决方案是:低((高 – 低)/ 2)
最后列举>>>>>>>和/之间的区别:
>>>>是逻辑右移。它用零填充高位。
>>>是算术右移。它用原始顶部的副本填充它的上部。
> /是分。
数学上:
> x>>>> 1将x视为无符号整数,并将其除以2。它四舍五入> x>> 1将x作为有符号整数,并将其除以2。它向负无穷大转。> x / 2将x作为有符号整数,并将其除以2。它向零转。