【问题标题】:Porting bit modification code from C to Java将位修改代码从 C 移植到 Java
【发布时间】:2013-09-29 11:09:02
【问题描述】:

我正在用 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 中没有像无符号运算符这样的东西,我认为这会导致将某些表示理解为负数的问题。 有人可以帮我将该代码翻译成 Java 吗? 非常感谢!

【问题讨论】:

  • 注意栈溢出不是代码翻译服务,贴出你试过的java代码,做了什么,出了什么问题
  • 是的对不起,我不想让你翻译,我想我没有解释清楚。我没有在 Java 中尝试任何奇怪的东西,主要是因为我不知道无符号变量或如何用该语言模拟它们,我只是尝试将 unsigned 替换为 int,并在它不起作用时搜索。无论如何,csoroiu 的回答很完美。

标签: java c bit translate unsigned


【解决方案1】:

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

如果您的 unsigned 类型是 32 位长,这应该是有效的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2013-11-25
    • 2015-06-18
    • 2011-08-30
    • 2023-03-09
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多