我正在使用Java进行pokerHand评估,因为我使用的是在C(http://www.suffecool.net/poker/evaluator.html)中实现的。我已经“翻译”了代码,它运行得非常好而且速度很快。现在我想添加一些HashTables以使其更快,看起来非常简单,如下所述:http://www.paulsenzee.com/2006/06/some-perfect-hash.html 但最终代码不起作用,我意识到这是在以下函数中:
unsigned find_fast(unsigned u)
{
unsigned a, b, r;
u += 0xe91aaa35;
u ^= u >> 16;
u += u << 8;
u ^= u >> 4;
b = (u >> 8) & 0x1ff;
a = (u + (u << 2)) >> 19;
r = a ^ hash_adjust[b];
return r;
}
我认为在C中没有任何其他东西的“无符号”是一个整数,但是在java中,这个函数不会生成与C中相同的函数,而r有时是负值,这没有意义。据我所知,没有像Java中的unsigned运算符那样,我认为会导致问题将某些表示理解为负数。 有人可以帮助我将该代码翻译成Java吗? 非常感谢!
答案 0 :(得分:2)
尝试将unsigned
更改为int
并将>>
移位运算符更改为java的>>>
无符号移位运算符。
如果unsigned
类型的长度为32位,则该值应该有效。
在java中所有数字基元都已签名,但使用提示时,您的方法应该与C
版本类似。