Avatar billede tax Nybegynder
21. november 2003 - 10:34 Der er 8 kommentarer

effektivt bool array

Jeg skal bruge et bool array på ca 10000 pladser.

Mindste llokeringsenhed er 1 byte?

Derfor vil jeg spilde 7/8 af arrayets kapacitet hvis jeg bare allokerer

bool myarray[10000]

Istedet skal jeg bruge et hurtigt alternativ.

Jeg havde tænkt på at gøre flg. (Det er kun pseudokode)

bool myarray[(int)ceil(10000/8)];

bool boundtype(int index)
{
    int i_byte = index / 8;
    int i_bit  = index % 8;
    return (myarray[i_byte] &&  (1 << i_bit))
}

jeg er i tvivl om << operationen er korrekt. Jeg ved ikke om MSB ligger i højre eller venstre side af bitrækken?!?

Er der andre måder at gøre dette på?
Avatar billede tax Nybegynder
21. november 2003 - 10:38 #1
bool getbound(int index)
{
    int i_byte = index / 8;
    int i_bit  = index % 8;
    return (bounds[i_byte] &&  (0x01 << i_bit));
}

void setbound(int index, bool val)
{
    int i_byte = index / 8;
    int i_bit  = index % 8;
    bounds[i_byte] = bounds[i_byte] | (0x01 << i_bit);
}


pseudokodede lidt videre...
Avatar billede arne_v Ekspert
21. november 2003 - 10:39 #2
Du kan jo selv bestemme om du vil nummere bits 7 6 5 4 3 2 1 0
eller 0 1 2 3 4 5 6 7 - din kode bruger det første.
Avatar billede arne_v Ekspert
21. november 2003 - 10:40 #3
Medmindre du har et seriøst memory problem, så vil jeg anbefale den
simple løsning. 10000 byte er ikke mange bytes idag.
Avatar billede arne_v Ekspert
21. november 2003 - 10:41 #4
Jeg har iøvrigt noget bit C++ kode liggende som du måske kunne få
fornøjelse af (det kan gemme og hente variabelt antal bits).
Avatar billede tax Nybegynder
21. november 2003 - 10:47 #5
Det var nok mest for at høre andre om hvordan det gøres. Måske var det optimeret i kompileren?
Avatar billede segmose Nybegynder
21. november 2003 - 10:51 #6
Det ser jo rimeligt fornuftigt ud hvis:
sizeof(bool)==1
CHAR_BIT == 8
Hvis du går efter den ultimative effiktivitet skulle du måske overvej at bruge:
const BITS = (sizeof(int)*CHAR_BIT);
int bounds[(int)ceil(10000/BITS)];
og skifte alle 8-tallene ud med BITS.
da tilgangen til int formodentlig er hurtigere.
Avatar billede segmose Nybegynder
21. november 2003 - 11:40 #7
Du kan jo undersøge om din kopilers implementation af
#include <bitset>

er noget værd.
Avatar billede olennert Nybegynder
21. november 2003 - 13:59 #8
bitset kan bruges hvis størrelsen af dit bitset er kendt på oversættelsestidspunktet, altså, du kan ikke tilføje eller fjerne elementer fra dit bitset. Hvis du har brug for at kunne dette kan du overveje vector<bool>, blot du er klar over at vector<bool> strengt taget ikke er en STL container, selvom den er i STL, og vector<T> generelt er en container. Eksempelvis kan du ikke med vector<bool> lave en

vector<bool> v;
bool* pb = &v[0];

hvilket du skal kunne med en rigtig STL container. Se evt. Scott Meyers Effective STL, item 18. Rigtig, rigtig god bog til en der ved noget om C++ i forvejen (ligesom Effective C++ og More Effective C++ af samme forfatter).
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