سؤال

أنا أبحث عن جافا جيدة BitSet مثال للعمل مع 0 و1S.حاولت النظر إلى Javadocs ولكني لا أفهم استخدام الفصل بمجرد قراءة ذلك.على سبيل المثال، كيف and, or, ، و xor تعمل الطرق على طريقتين مختلفتين 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), ، لقد قمت بتعيين الجزء المليون والبت الأول على القيمة true.ثم عندما تقاطعت مع bits1, ، والتي كانت تحتوي على مليون و111 ألف و111 بت، لم يكن لديهم أي أجزاء مشتركة.

أعتقد ما أنت عنى كان القيام به

 bits2.set(0); // set the 0th bit
 bits2.set(6); // set the 6th bit

هل يساعد هذا في توضيح الأمور؟

نصائح أخرى

إذا كنت تريد العمل مع البتات، يمكنك استخدامها int القيم في جافا 7

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 التي قد تساعدك:

تحديث:

ويقال في المستندات:

مجموعة الفراغ العام (int bitIndex)

Sets the bit at the specified index to true.

لذلك عندما تتصل bits2.set(10);, ، يعتبر 10 عشرية لا 1 0 إذن ما تحصل عليه هو الرقم التالي 1000000000.

لتعيينه بشكل صحيح، في هذا المثال، أريد ضبط البت الثاني على 1، لذلك أقوم بالاتصال bits2.set(1); لأن الفهرس يبدأ عند 0.

ختاماً, ، لكل بت مضبوط على 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top