这是一个非常晦涩的问题,我怀疑我必须在我的代码中的不同级别来解决这个问题......但希望 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/