根据 3 个不同的整数创建一个唯一的整数

Creating a unique integer based on 3 different integers

我想在 Java 中根据坐标 xyy 创建一个名为 hashint w.

xy 的值是带符号的,通常是负数。

int 的大小是 32 位。

我想将 4 位分配给 w(如果最高有效位不可用,则分配 3 位),将 14 位分配给 x,将 14 位分配给 y .

我尝试了以下方法,但我完全不明白为什么值会冲突:w + x << 4 + y << 18.

例如,x = 1w == 0 时与 y = 1 冲突。

这样做的好处如下:

这里唯一的问题是运算符优先级。 + 在 << 之前,所以你必须这样写:

w + (x << 4) + (y << 18)

这不会将 wx 限制在它们分配的字段中,但这不会对哈希值造成不良影响。如果您使用 | 来组合它们,那么当 wx 得到负数时,这将是一个糟糕的散列,但是 +.

没问题

你的问题是运算符优先级+优先于<<,所以你的表达式

w + x << 4 + y << 18

等同于

((w + x) << (4 + y)) << 18

试试这个:

w + (x << 4) + (y << 18)
int hash =  w << 28 | (x & 0x3FFF) << 14 | y & 0x3FFF;

+ 不是按位运算符。这将使它看起来像这样:

11110000000000000011111111111111
w -^ X          -^ Y          -^