-2

将此代码用于密码学家庭作业,但无法理解第 59 行

感谢帮手。

4

1 回答 1

1

它是一样的;int一个值左移 11 位。

底部 21 位向上移动 11,而顶部 11 位向下移动 21。

这是散列中使用的一种常见模式,因为它可以快速重新排列数字的位而不会丢失随机性。

Integer.rotateLeft 的来源

返回通过将指定 int 值的二进制补码表示向右旋转指定位数获得的值。(位移出右手,或低位,左侧重新进入,或高位。)

请注意,负距离的右旋转等效于左旋转:rotateRight(val, -distance) == rotateLeft(val, distance)。另请注意,旋转 32 的任意倍数是无操作的,因此可以忽略旋转距离的最后五位以外的所有位,即使距离为负:rotateRight(val, distance) == rotateRight(val, distance & 0x1F)。

返回: 通过将指定 int 值的二进制补码表示右移指定位数获得的值。

public static int rotateRight(int i, int distance) {
    return (i >>> distance) | (i << -distance);
}
于 2016-05-16T08:27:55.473 回答