java - 查找具有特定位集的多头的所有组合

标签 java bit-manipulation poker

这是一个非常晦涩的问题,我怀疑我必须在我的代码中的不同级别来解决这个问题......但希望 Stack Overflow 的 hive 思维可以帮助......

我有一个 long,如果将其表示为二进制字符串,则正好设置了五个位。例如,

long l = 341; // as a bit string, "101010101"

我正在寻找一个包含所有十个可能的 longs 的数组,其中三个位正好设置。继续这个例子,

long[] results = {
  101010000,
  101000100,
  101000001,
  100010100,
  100010001,
  100000101,
    1010100,
    1010001,
    1000101,
      10101
}

适当的方法签名可能如下所示:

public long[] toThreeBitCombinations(long l) {
    // what goes here?
}

(问题领域是扑克;枚举奥马哈扑克手牌中所有可能的牌组合。是的,还有其他方法可以解决这个问题,但我正在测试这种方法,因为处理比特比处理比特要快得多大多数其他选择。)

最佳答案

嗯,我明白了。我认为。我为我不太确定的零散字段构建了一个版本的 Gosper's Hack,但它适用于这种情况。

static long next(long v, long m)
{
    long t = v | (v - 1 & m);
    long t1 = (((t | ~m) + 1) & m);
    int c = Long.numberOfTrailingZeros(v) + 2; // *
    long w = t1 | (((~t & t1) - 1 & m) >>> c);
    return w;
}

我不确定为什么标有星号的行中的 2 是 2 而不是 1。

无论如何,如果您在一个循环中执行 x = next(x, 0x155)(当然是从 x = 0x15 开始),您会得到您列出的十件事。

关于java - 查找具有特定位集的多头的所有组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19069488/

相关文章:

java - 不使用构造函数获取子类的 java.lang.Class 实例

C 语法/AVR header

c++ - 使用 pokerstove 库提高性能

java - 扑克游戏中未处理的异常

java - 如何修复 Poker Deck 使其不重新实例化并将其限制为一副牌中只有 52 张牌?

java - 对于生成程序,java中有 "CodeModel API",就像Objective-C有没有API一样?

java - 如何使用 JFileChooser 将 CSV 文件数据输入到 JTable 中

java - 与 onActivityResult 一起使用时无法引用非最终 Intent

c++ - 有没有更有效的方法来获取以字节为单位的 32 位整数的长度?

C 宏表达式返回值