57

ビット操作を実行したい整数がある場合、どうすればそれを?にロードできますjava.util.BitSetか?どうすればintまたはlongに戻すことができますか?サイズについてはそれほど心配していませんBitSet。常に32ビットまたは64ビットの長さになります。ビット演算子ではなく、、、、、およびメソッドを使用したいのですがset()、数値型でビットセットを初期化する簡単な方法が見つかりません。clear()nextSetBit()nextClearBit()

4

6 に答える 6

65

次のコードは、長い値からビットセットを作成し、その逆も同様です。

public class Bits {

  public static BitSet convert(long value) {
    BitSet bits = new BitSet();
    int index = 0;
    while (value != 0L) {
      if (value % 2L != 0) {
        bits.set(index);
      }
      ++index;
      value = value >>> 1;
    }
    return bits;
  }

  public static long convert(BitSet bits) {
    long value = 0L;
    for (int i = 0; i < bits.length(); ++i) {
      value += bits.get(i) ? (1L << i) : 0L;
    }
    return value;
  }
}

編集:今、両方向、@ leftbrain:原因の、あなたは正しい

于 2010-03-18T22:15:56.873 に答える
47

finnwの答えに追加:ともBitSet.valueOf(long[])ありBitSet.toLongArray()ます。それで:

int n = 12345;
BitSet bs = BitSet.valueOf(new long[]{n});
long l = bs.toLongArray()[0];
于 2014-03-25T18:17:32.110 に答える
20

Java7にBitSet.valueOf(byte[])BitSet.toByteArray()

Java 6以前を使いBigInteger続けている場合は、パフォーマンスのボトルネックになる可能性が低い場合に使用できます。JavaにはgetLowestSetBit、メソッドがsetBitあります(最後の2つは、インプレースで変更する代わりにclearBit新しいメソッドを作成します)。BigInteger

于 2011-02-02T14:42:51.800 に答える
3

「流暢な」方法で小さなlongものから取り戻すには: BitSet

long l = bitSet.stream()
        .takeWhile(i -> i < Long.SIZE)
        .mapToLong(i -> 1L << i)
        .reduce(0, (a, b) -> a | b);

逆に:

BitSet bitSet = IntStream.range(0, Long.SIZE - 1)
        .filter(i -> 0 != (l & 1L << i))
        .collect(BitSet::new, BitSet::set, BitSet::or);

注意:使用するBitSet::valueOfことBitSet::toLongArrayはもちろん簡単です。

于 2016-07-04T13:17:33.660 に答える
1

nextSetBitのドキュメントからほぼ直接

value=0;
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
 value += (1 << i)
 }
于 2014-07-14T22:36:15.890 に答える
-3

public void set(int bit)あなたが探している方法ではありませんか?

于 2010-03-18T22:09:22.247 に答える