Поддержка этих битовых операций для больших типов данных - PullRequest
1 голос
/ 19 января 2020

Я нашел хорошую 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));
 }
...