Avatar billede netsrac Praktikant
11. april 2002 - 19:58 Der er 17 kommentarer og
2 løsninger

Hvordan gemmer jeg mest praktisk et bit mønster ?

Hvordan gemmer jeg mest praktisk et bit mønster, som jeg senere skal bruge bit for bit ?
Avatar billede netsrac Praktikant
11. april 2002 - 19:58 #1
og som bliver skabt bit for bit ?
Avatar billede soreno Praktikant
11. april 2002 - 20:01 #2
en mulighed var et array af bool
Avatar billede soreno Praktikant
11. april 2002 - 20:03 #3
en anden kunne være at konvertere til heltal og gemme dem i et array, men det dur jo ikke hvis det drejer sig om mange bit (int er 32bit i java ?)
Avatar billede netsrac Praktikant
11. april 2002 - 20:11 #4
Det kan maks blive til 8 bit, men det vides ikke på forhånd hvor mange bit det bliver på.

Det dur ikke at konvertere det til et heltal, skal bruge det som et bit mønster og det skal være hurtigt tilgængeligt. Men du siger da noget, jeg kan jo bare lave det som et array af integers.

Det gør jeg, tak for responsen, læg et svar :)
Avatar billede soreno Praktikant
11. april 2002 - 20:12 #5
..
Avatar billede netsrac Praktikant
11. april 2002 - 21:48 #6
Hm..det holder ikke alligevel, jeg har jo ingen måde at vide hvor mange byte der blev gemt så ?
Avatar billede jakoba Nybegynder
11. april 2002 - 21:59 #7
hvad med en streng?
"0001011011100101111110011";

den kan blive så lange der er brug for og du kan tilgå den med charAt( index );

det koster godt nok 8 bit pr bit du vil gemme. men det er da ret billigt med moderne rampriser.
Avatar billede netsrac Praktikant
11. april 2002 - 22:09 #8
Tja, det er da ihvertfald bedre som at bruge 32 bit på det, så jeg tror det er den løsning jeg vælger. Hvis du lige lægger et svar jakoba.
Avatar billede soreno Praktikant
11. april 2002 - 22:15 #9
det var sådan jeg havde tænkt:
public static void main(String args[])
{
    Integer a[] = new Integer[5];

    a[0] = new Integer(11);  //1011
    a[1] = new Integer(34);  //100010
    a[2] = new Integer(121); //1111001
    a[3] = new Integer(251); //11111011
    a[4] = new Integer(21);  //10101

    String bitCount = "";
    for(int i=0;i<a.length;i++)
    {
        bitCount = bitCount + Integer.toBinaryString((a[i].intValue()));           
    }
    System.out.println(bitCount); //divider med 8 og rund op == antal bytes
}
Avatar billede soreno Praktikant
11. april 2002 - 22:16 #10
sålænge du ikke kommer over 8 bit, kan du forresten bruge en Char istedet for en Integer
Avatar billede jakoba Nybegynder
11. april 2002 - 22:19 #11
42
Avatar billede netsrac Praktikant
11. april 2002 - 22:27 #12
Takker for input :)
Avatar billede soreno Praktikant
11. april 2002 - 22:30 #13
det var en Byte istedet for en Integer :-)
Avatar billede jkrag Nybegynder
11. april 2002 - 22:37 #14
Jeg kan kun sige:
java.util.BitSet

:-)
Den kan vokse efter behov, understøtter logiske operatorer, er serializerbar ...
Er det ikke smartere end diverse hjemmegjorte hacks?
Avatar billede jakoba Nybegynder
11. april 2002 - 22:51 #15
Ups.  Helt klart. hvis bare man kendte den :-))
Avatar billede jkrag Nybegynder
11. april 2002 - 23:29 #16
Så er det jo trist jeg kommer for sent med mit svar :-)
Men du kan jo forhåbentligt bruge det alligevel. Og måske er der andre :-) der også kunne have glæde af tippet.
Avatar billede quaid Nybegynder
12. april 2002 - 08:10 #17
Jkragh: Hjemmegjorte hacks er ikke altid pr definition dårlige.
Det at den er dynamisk kan meget vel gøre den langsom, se blot et vector der er implementert som et array der bare kopierer sig selv over i et større array.
QD::
Avatar billede jakoba Nybegynder
12. april 2002 - 08:41 #18
Ikke altid måske, men som grundregel er det dumt at bruge et hjemmegjort hack når der findes noget standard.

Den der programmerer et hjemmegjort hack skal helt ud i alle hjørner af anvendelser før han skriver 5 linier kode der tager hensyn til alle fejlmuligheder, Og man kan sjældent se på koden hvad det er for sære specialtilfælde den tager hensyn til.

Så når en anden sidenhen skal modificere i programmet skal han hele vejen igennem samme process. Smarte hacks er en bjørnetjeneste at gøre dem der følger efter. Brug hellere en standardklasse. Den er dokumenteret og der er endda en chanc for at de der følger efter kender den allerede.

mvh JakobA
Avatar billede jkrag Nybegynder
12. april 2002 - 11:45 #19
Og så var der iøvrigt ingen af de foreslåede løsninger der slog mig som rene performance vidundere (som ellers bør være stort set den eneste undskyldning for at genimplementere ting selv.)

Iøvrigt er BitSet netop lavet til at være effektiv.
Den gemmer bits i et array af units det pt. er long's dvs. en blok indeholder 64 bit.
På denne måde kan f.eks de fleste logiske operationer klares i næsten konstant tid.
(  O(n/64) - ja, jeg ved..., det er principielt O(n), men nærmere O(1) i praksis hvis man har et begrænset antal bit.)

Den eneste metode i klassen der faktisk itererer over det fulde antal af bits i settet er toString() :-)

Koden er iøvrigt interessant læsning....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester