Я нашел хорошую Java реализацию методов битового тиддлинга здесь , для которой, я думаю, многие основаны на этом документе . В частности, для toBitSet
и nextPermutation
мне интересно: можно ли заставить их поддерживать типы данных, которые могут go превышать 64 бита (long
)? И как?
Можно ли определить такие методы, например, для Java 'BigInt
?
Или выполнить итерацию по k -битным двоичным строкам (из длина n ) (где k = # биты установлены в 1, n = всего # битов), как это делает nextPermutation
, требуется (медленнее ) String
реализация (т. Е. Представлять двоичные числа как n -характеры)?
Ниже приведен источник вышеупомянутых операций. Я сожалею, что не смог добавить больше информации, с сожалением признаю, что у меня мало знаний о побитовых операциях в целом. Любые предложения приветствуются.
toBitSet:
/**
* Converts {@code value} into a {@link BitSet} of size {@code size}.
*/
public static final BitSet toBitSet(final int size, final long value) {
BitSet bits = new BitSet(size);
int idx = 0;
long tmp = value;
while (tmp != 0L) {
if (tmp % 2L != 0L) {
bits.set(idx);
}
++idx;
tmp = tmp >>> 1;
}
return bits;
}
nextPermutation:
/**
* Compute the lexicographically next bit permutation.
*
* Suppose we have a pattern of N bits set to 1 in an integer and we want the next permutation of
* N 1 bits in a lexicographical sense. For example, if N is 3 and the bit pattern is 00010011,
* the next patterns would be 00010101, 00010110, 00011001,00011010, 00011100, 00100011, and so
* forth.
*/
public static final long nextPermutation(long val) {
long tmp = val | (val - 1);
return (tmp + 1) | (((-tmp & -~tmp) - 1) >> (Long.numberOfTrailingZeros(val) + 1));
}