我想在坐标int
,hash
和x
中用Java创建一个名为y
的{{1}}。
w
和x
的值已签名且通常为负数。
y
的大小为32位。
我想将4位分配给int
(如果最高有效位不可用则为3位),将14位分配给w
,将14位分配给x
。< / p>
我尝试了以下方法,但我不明白为什么值会发生冲突:y
。
例如,w + x << 4 + y << 18
时x = 1
与y = 1
发生冲突。
这样做的好处如下:
答案 0 :(得分:2)
这里唯一的问题是运营商优先级。 +在&lt;&lt;之前,所以你必须这样写:
w + (x << 4) + (y << 18)
这并不会将w
或x
限制在他们分配的字段中,但这并不会使用哈希值做坏事。如果您使用|
来组合它们,那么当w
或x
获得否定时,这将是一个错误的哈希值,但+
它很好。
答案 1 :(得分:1)
您的问题是运算符优先级:+
优先于<<
,因此您的表达式
w + x << 4 + y << 18
相当于
((w + x) << (4 + y)) << 18
试试这个:
w + (x << 4) + (y << 18)