Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Szukam biblioteczki/pojedynczej klasy - array liczb o wybranej wielkości, np 5 bitow na liczbę.


Rekomendowane odpowiedzi

Opublikowano

Tak jak w temacie, szukam czegoś wydajnego do przechowywania sporej, ale stałej ilości liczb o stałej ale nietypowej wielkości, od 4 do  ~16 bitów, np 7 bitowe, 13 bitowe itd i z możliwością pobierania tego jako array np byte[] czy tam long[], oczywiście jak mamy np 7 bitowe liczby i nasze "array" wielkości 3 to takie byte[] wyglądało by tak:

[1111, 1112, 2222, 2233, 3333, 3000]  // bitowo, ktory bit należy do której liczby, + dopełnienie zerami na końcu

Nie ma żadnych przerw ani nic.

Czyli takie array.

 

A jak by ktoś znalazł wersję opierającą się na atomowych array, to już wgl by było pięknie, ale to tam mniej ważne.

 

Mniej-więcej coś takiego:

class NBitArray
{
    NBitArray(int size, int bitsPerEntry);

    void set(int index, int number);

    int get(int index);

    byte[] getArray();
}

Szukam bo jednak zabawy z bitami zawsze szły mi dość kiepsko, a to musi być wydajne.https://github.com/orbisgis/cts/blob/master/src/main/java/org/cts/op/transformation/grids/BleggGeographicGrid.java#L364-L368

 

Znalazłem coś takiego, ale coś nie ufam wydajności odczytywania w pętli pojedynczych bitow z BitSet.

1438614356923701010629.png

 

Opublikowano

Znalazłem coś takiego, ale coś nie ufam wydajności odczytywania w pętli pojedynczych bitow z BitSet.

 

W metodzie get masz taki kod:

    public boolean get(int bitIndex) {
        if (bitIndex < 0)
            throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);

        checkInvariants();

        int wordIndex = wordIndex(bitIndex);
        return (wordIndex < wordsInUse)
            && ((words[wordIndex] & (1L << bitIndex)) != 0);
    }

checkInvariants zawiera tylko assert, a wordIndex wygląda tak:

    private static int wordIndex(int bitIndex) {
        return bitIndex >> ADDRESS_BITS_PER_WORD;
    }

Możesz też pobrać to jako array typu byte lub long. Imo idealnie pasuje do Twojego opisu.

 

Co do atomic: http://stackoverflow.com/questions/12424633/atomicbitset-implementation-for-java

 

@GotoFinal - Dobra, sorry, nie zrozumiałem o co Ci chodziło :s

708121422388637873334.png

Opublikowano

 

W metodzie get masz taki kod:

    public boolean get(int bitIndex) {
        if (bitIndex < 0)
            throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);

        checkInvariants();

        int wordIndex = wordIndex(bitIndex);
        return (wordIndex < wordsInUse)
            && ((words[wordIndex] & (1L << bitIndex)) != 0);
    }

checkInvariants zawiera tylko assert, a wordIndex wygląda tak:

    private static int wordIndex(int bitIndex) {
        return bitIndex >> ADDRESS_BITS_PER_WORD;
    }

Możesz też pobrać to jako array typu byte lub long. Imo idealnie pasuje do Twojego opisu.

 

Co do atomic: http://stackoverflow.com/questions/12424633/atomicbitset-implementation-for-java

chodzi właśie o to że ten kod będzie się musiał wykonywac po nawet 12 razy do odczytania 1 liczby (12 bitowej), gdzie pewnie na innych typach dało by się to ograniczać do 1-3 pobrań i kilku przesunięć.

1438614356923701010629.png

 

Opublikowano

Zrobione na szybko, powinno działać. Można jeszcze poprawić wydajność, czytelność i napisać jakieś wiadomości wyjątków :)

https://gist.github.com/Jaca777/773c0e712441db58fb5d

@GotoFinal - Tutaj jest jeszcze jakiś głupi błąd, ale zasadę chyba widać (sorry, ale nie mam już na to czasu dzisiaj):

https://gist.github.com/Jaca777/435018f143e22496e8f6

708121422388637873334.png

Opublikowano

Zrobione na szybko, powinno działać. Można jeszcze poprawić wydajność, czytelność i napisać jakieś wiadomości błędów ;)

https://gist.github.com/Jaca777/773c0e712441db58fb5d

O, nie spodziewałem się takiej odpiwedzi, dzięki za to, ale działa tylko prawie :D

Bo jednocześnie nie wspiera liczb ujemnych (to mi nie potrzebne), a jednocześnie nie daje sobie rady z ostatnim (pierwszym?) bitem, czyli jak damy 5 bitów, mamy tylko 4 bity użyteczne. (a to juz bardziej)

http://ideone.com/N4G76i 

 

Może się potem postaram też tym pobawić, jak dokończę kilka innych rzeczy.

1438614356923701010629.png

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...