将位修改代码从C移植到Java

时间:2013-09-24 09:46:37

标签: java c bit translate unsigned

我正在使用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吗? 非常感谢!

1 个答案:

答案 0 :(得分:2)

尝试将unsigned更改为int并将>>移位运算符更改为java的>>>无符号移位运算符。

如果unsigned类型的长度为32位,则该值应该有效。

在java中所有数字基元都已签名,但使用提示时,您的方法应该与C版本类似。