私は0と1で動作する良いJava BitSet
の例を探しています。Javadocsを調べてみましたが、たとえば、and
、or
、およびxor
メソッドは、2つの異なるBitSet
オブジェクトでどのように機能しますか?
例えば:
BitSet bits1 = new BitSet();
BitSet bits2 = new BitSet();
bits2.set(1000001);
bits1.set(1111111);
bits2.and(bits1);
System.out.println(bits2);
これを行うと、bits2
が空として返されます。なぜですか?
あなたが言及した特定の問題について:bits2.set(1000001)
を呼び出したとき、100万番目と最初のビットをtrueに設定します。次に、bits1
(100万、111 1000、および111番目のビットが設定されている)と交差したとき、共通のビットはありませんでした。
あなたが意味することは
bits2.set(0); // set the 0th bit
bits2.set(6); // set the 6th bit
これは物事を片付けるのに役立ちますか?
ビットを使用したい場合は、Java 7でint
値を使用できます。
int bits2 = 0b1000001;
int bits1 = 0b1111111;
bits2 &= bits1;
System.out.println(Integer.toBinaryString(bits2));
プリント
1000001
BitSetには、そのようなビットの文字列を受け入れるための便利なメソッドがありません。以下にいくつかを提供しましたが、この例は期待どおりに機能します。これはJava 7;の新しい機能を使用することに注意してください; Java 6。
import Java.util.BitSet;
class Scratch {
public static void main(String[] args) {
BitSet bits1 = fromString("1000001");
BitSet bits2 = fromString("1111111");
System.out.println(toString(bits1)); // prints 1000001
System.out.println(toString(bits2)); // prints 1111111
bits2.and(bits1);
System.out.println(toString(bits2)); // prints 1000001
}
private static BitSet fromString(final String s) {
return BitSet.valueOf(new long[] { Long.parseLong(s, 2) });
}
private static String toString(BitSet bs) {
return Long.toString(bs.toLongArray()[0], 2);
}
}
役立つBitSetに関するリンクを次に示します。
UPDATE:
ドキュメントでは、それは言われています:
public void set(int bitIndex)
_Sets the bit at the specified index to true.
_
したがって、bits2.set(10);
を呼び出すと、10 decimalではなく1 0なので、次の番号_1000000000
_が得られます。
正しく設定するには、この例では、2番目のビットを1に設定したいので、インデックスはで始まるため、bits2.set(1);
を呼び出します。
結論として、1に設定されたビットごとに、bitSet.Setを呼び出してビットのインデックスを提供する必要があります。
入力としてビットの文字列を使用してBitSetオブジェクトを作成するための実装を共有しています。
private static BitSet createFromString(String s) {
BitSet t = new BitSet(s.length());
int lastBitIndex = s.length() - 1;
for (int i = lastBitIndex; i >= 0; i--) {
if ( s.charAt(i) == '1'){
t.set(lastBitIndex - i);
}
}
return t;
}
文字列入力「1001」の場合
BitSet s1 = createFromString("1001");
System.out.println(s1);
出力:
{0, 3}
これを試して:
import Java.util.BitSet;
public class BitSetExample {
public static void main(String args[]){
BitSet bits1 = new BitSet(7);
BitSet bits2 = new BitSet(7);
// set some bits
for(int i = 0; i < 7; i++) {
if((i % 2) == 0) bits1.set(i);
if((i % 3) != 0) bits2.set(i);
}
System.out.println("BitSet1: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits1.get(i)? "1 ": "0 ");
}
System.out.println("\nBitSet2: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits2.get(i)? "1 ": "0 ");
}
System.out.println();
//And
bits1.and(bits2);
System.out.println("b1 = b1 AND b2\nBitSet1: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits1.get(i)? "1 ": "0 ");
}
System.out.println();
System.out.println("BitSet2: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits2.get(i)? "1 ": "0 ");
}
System.out.println();
//Or
bits1.or(bits2);
System.out.println("b1 = b1 OR b2\nBitSet1: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits1.get(i)? "1 ": "0 ");
}
System.out.println();
System.out.println("BitSet2: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits2.get(i)? "1 ": "0 ");
}
System.out.println();
//Xor
bits1.xor(bits2);
System.out.println("b1 = b1 XOR b2\nBitSet1: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits1.get(i)? "1 ": "0 ");
}
System.out.println();
System.out.println("BitSet2: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits2.get(i)? "1 ": "0 ");
}
System.out.println();
//Setting bits to zero and one
bits1.set(1);
bits2.set(1,false);
System.out.println("set bit 1 of BitSet1 to one and set bit 1 of BitSet2 to zero\nBitSet1: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits1.get(i)? "1 ": "0 ");
}
System.out.println();
System.out.println("BitSet2: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits2.get(i)? "1 ": "0 ");
}
System.out.println();
}
}
これが役に立つことを願っています。詳細については、 https://github.com/m-vahidalizadeh/foundations/blob/master/src/data_structures/BitSetExample.Java をご覧ください。