2012-02-17 9 views
47

मैं 0 और 1s के साथ काम करने के लिए एक अच्छा जावा BitSet उदाहरण ढूंढ रहा हूं। मैंने जावाडॉक्स को देखने की कोशिश की लेकिन मुझे बस इसे पढ़कर कक्षा के उपयोग को समझ में नहीं आया। उदाहरण के लिए, 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 रिटर्न करते हैं ऐसा क्यों है?

+2

http://en.wikipedia.org/wiki/Bitwise_operation - वे के रूप में वे एक ही बिल्कुल उसी तरह काम करता है, तो आप उपयोग कर रहे थे 'और |^'आदि एक आदिम संख्यात्मक प्रकार के साथ। –

+0

क्या, विशेष रूप से, आप समझ में नहीं आता? आप बिट्ससेट बनाते हैं और उसके बाद '.and', '.or' और' .xor' जैसे फ़ंक्शन कॉल करते हैं। इनमें से प्रत्येक कार्य पैरामीटर के रूप में एक और बिटसेट ऑब्जेक्ट लेता है। – Tony

+0

ठीक है, मैंने ऊपर दिए गए उदाहरण पर 'और' करने की कोशिश की और बिटसेट खाली हो गया। –

उत्तर

94

आपके द्वारा उल्लिखित विशिष्ट समस्या के लिए: जब आप bits2.set(1000001) कहलाते हैं, तो आप एक लाखवां और पहले बिट को सत्य पर सेट करते हैं। फिर जब आप bits1 के साथ छेड़छाड़ करते थे, जिसमें एक लाख, 111 हजार, और 111 वें बिट सेट थे, तो उनके पास आम बात नहीं थी।

मुझे लगता है कि तुम क्या मतलब क्या करने के लिए किया गया था

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

क्या यह मदद स्पष्ट बातें?

8

यहाँ है कि आप में मदद मिलेगी bitSet के बारे में कुछ लिंक कर रहे हैं:

अद्यतन:

डॉक्स में, यह है कहा:

सार्वजनिक शून्य सेट (int bitIndex)

Sets the bit at the specified index to true. 

तो जब आप bits2.set(10); कहते हैं, यह के रूप में 10 दशमलव माना जाता है नहीं तो निम्न संख्या 1000000000 वह पाएं ।

इसे सही ढंग से सेट करने के लिए, इस उदाहरण में, मैं 1 के लिए 2 बिट सेट करना चाहते हैं, तो मैं bits2.set(1); कहते हैं क्योंकि सूचकांक में शुरू होता है।

निष्कर्ष में, प्रत्येक बिट सेट 1 के लिए, आपको bitSet.Set को कॉल करने और बिट की अनुक्रमणिका प्रदान करने की आवश्यकता है।

39

बिटसेट में बिट्स के तारों को स्वीकार करने के लिए सुविधा विधियां नहीं हैं। मैंने नीचे कुछ प्रदान किया है, और अब उदाहरण के रूप में काम करता है जैसा आप उम्मीद करेंगे। ध्यान दें कि यह जावा 7 में नई कार्यक्षमता का उपयोग करता है; यह ऑनलाइन इन तरीकों में से कार्यान्वयन को खोजने के लिए आसान है आप जावा 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); 
    } 
} 
+1

बिल्कुल सही देखो! मुझे आपकी 'toString (बिटसेट बीएस) विधि पसंद आया। बहुत उपयोगी! आप दाईं ओर बिट_0 डालने के लिए बिट्स को उलटा कर सकते हैं। –

52

उपयोग करने के लिए आप बिट्स के साथ काम करने के लिए आप जावा 7 में int मूल्यों का उपयोग कर सकते हैं करना चाहते हैं।

int bits2 = 0b1000001; 
int bits1 = 0b1111111; 
bits2 &= bits1; 
System.out.println(Integer.toBinaryString(bits2)); 

प्रिंट

1000001 
+0

आप उन्हें 'ints' वे' 4 byte' या '7 bits' ले जा रहे हैं बचाने के लिए जब? – daydreamer

+1

@daydreamer [स्रोत कोड] को देखते हुए (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/BitSet.java) से पता चलता है कि एक 'बिटसेट' दृश्यों के पीछे 'लंबे [] 'के रूप में लागू किया गया है। "Ith सा बिट्स में संग्रहीत है [i/64] बिट स्थिति मैं% 64 पर (बिट स्थिति 0 कम से कम महत्वपूर्ण बिट को संदर्भित करता है और 63 सबसे महत्वपूर्ण बिट को संदर्भित करता है, जहां)।" तो कम से कम, कोई भी बिटसेट 64 बिट्स का उपयोग करेगा। यहां तक ​​कि parametrized निर्माता का कहना है – mbomb007

4

मैं इनपुट के रूप में बिट्स की स्ट्रिंग का उपयोग एक 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} 
+1

क्यों आप थोड़ी देर के पाश का उपयोग कर रहे हैं "एक सा सेट जिसका प्रारंभिक आकार ** इतना बड़ा ** स्पष्ट रूप से सीमा में सूचकांक के साथ बिट्स का प्रतिनिधित्व करने के लिए है ... बनाता है"? लूप के लिए भी वही करेगा, क्योंकि आप प्रत्येक पुनरावृत्ति में एक से 'i' को कम कर रहे हैं। –

+0

संपादित करें: कोड के बेहतर संस्करण जो फॉर लूप का उपयोग करता है, सुझाव @ क्लेमेंट के लिए धन्यवाद :) –

0

इस प्रयास करें:

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

संबंधित मुद्दे