質問

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

役に立ちましたか?

解決

次のコードは、長い値とその逆の設定ビット作成

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;
  }
}

EDITED:今両方向、@leftbrain:原因で、あなたが正しいです。

他のヒント

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

int n = 12345;
BitSet bs = BitSet.valueOf(new long[]{n});
long l = bs.toLongArray()[0];

のJava 7持ちBitSet.valueOf(byte[])BitSet.toByteArray()

あなたは、Java 6またはそれ以前のバージョンで立ち往生している場合は、パフォーマンスのボトルネックになりそうでない場合は、

、あなたはBigIntegerを使用することができます - それはgetLowestSetBitsetBitclearBitメソッドを持っています(最後の二つではなく、イン変更の新しいBigIntegerを作成します。場所。)

'Streamyに' のように、バックの小さな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);

N.Bは:BitSet::valueOfBitSet::toLongArrayを使用することで、もちろん簡単になります。

、かなりストレートnextSetBitのドキュメントから

value=0;
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
 value += (1 << i)
 }

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top