Avatar billede tzr Nybegynder
02. januar 2002 - 17:27 Der er 11 kommentarer og
2 løsninger

read/write bit

20 point for simpel kode der kan der kan læse og skrive en bestemt bit i en char

altså hvis jeg siger til funktionen at den 3. bit i char[3] skal ændres til 1, så gør den det. Jeg vil også ha en tilsvarende funktion der kan læse

/Kenneth
Avatar billede alvion Nybegynder
02. januar 2002 - 18:10 #1
Det er ikke testet endnu:

function setbit(char c, const int pos)
{
  return c | (1 << (pos-1));
}

function clearbit(char c, const int pos)
{
  return c & ~(1 << (pos-1));
}

Avatar billede alvion Nybegynder
02. januar 2002 - 18:11 #2
Hov vi prøver lige igen:

function setbit(char c, const int pos)
{
  return c | (1 << pos);
}

function clearbit(char c, const int pos)
{
  return c & ~(1 << pos);
}


pos skal være et tal mellem 0 og 7 - det er den rigtige måde at angive det på
Avatar billede alvion Nybegynder
02. januar 2002 - 18:14 #3
Hold kæft jeg har kode for meget php på det sidste :-)

char setbit(char c, const int pos)
{
  return c | (1 << pos);
}

char clearbit(char c, const int pos)
{
  return c & ~(1 << pos);
}
Avatar billede alvion Nybegynder
02. januar 2002 - 18:14 #4
Er testet
Avatar billede alvion Nybegynder
02. januar 2002 - 18:16 #5
Du kan faktisk lave det som en makro, så det kan bruges på andet end chars:

#define setbit(c, pos) ((c) | (1 << (pos)))
#define clearbit(c, pos) ((c) & ~(1 << (pos)))
Avatar billede chries Nybegynder
02. januar 2002 - 18:18 #6
jeg går ud fra at det er bit 3 i et array af bytes ?

void set( char* array, const int byte_no, const char bit_no )
{
  array[byte_no] |= (1<<bit_no);
}

void clear( char* array, const int byte_no, const char bit_no )
{
  array[byte_no] &= ~(1<<bit_no);
}

byte_no 0 1 ...
bit_no 0 1 ...
Avatar billede alvion Nybegynder
02. januar 2002 - 18:39 #7
chries -> Du har læst spørgsmålet forkert:

\"...der kan der kan læse og skrive en bestemt bit i en char\"
Avatar billede chries Nybegynder
02. januar 2002 - 19:21 #8
\"..den 3. bit i char[3]..\"

det kommer an på hvordan man læser det :-) siden jeg kunne have ret, smider jeg lige læse funktionen oveni

bool is_set( char* array, const int byte_no, const char bit_no )
{
  if( array[byte_no] & (1<<bit_no) )
  {
    return true;
  }
  else
  {
    return false; 
  }
}
Avatar billede alvion Nybegynder
02. januar 2002 - 20:16 #9
Så\'n en kan jeg også lave til mit eksempel - som makro ;-)

#define getbit(c, pos) (bool)((c) & (1<<(pos)))
Avatar billede tzr Nybegynder
03. januar 2002 - 00:16 #10
jeg fatter minus af koden, men det virker jo :)
Avatar billede alvion Nybegynder
03. januar 2002 - 04:30 #11
Hvis det er en funktion, som du kalder rigtig mange gange (f.eks. i et loop), så brug makro-versionen - det går langt hurtigere, da der så ikke laves et decideret funktionskald.
Avatar billede tzr Nybegynder
04. januar 2002 - 10:54 #12
tak, men det går hurtigt nok i forvejen
Avatar billede soepro Nybegynder
07. januar 2002 - 14:31 #13
|= og &= er bit-vise funktioner der ændrer indholdet af variablen FORAN operatoren til indholdet EFTER operatoren. | er bit-vis OR, dvs. hvis blot en af de to bit på en given position er 1 bliver resultatet 1. & er bit-vis AND dvs. begge de to bit på positionen skal være 1 for at resultatet også bliver 1:

foran a = 0100 0011
efter b = 0010 0011

a |= b => 0110 0011
a &= b => 0000 0011

>> og << er bit-vise SHIFT operationen og ruller den enkelte bit en plads ned respektive op:

a << 3 => 0001 1000, svarende til at sætte 3 nuller EFTER
a >> 3 => 0000 1000, svarende til at sætte 3 nuller foran.

Ovenskydende bit forsvinder ud i det blå. (At shifte een bit mod venstre/<< er det samme som at gange tallet med 2 - at shifte een bit mod højre/>> - du gættede det, at dividere med 2.)
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