Programowanie w języku C/C++ » FAQ

Char jako tablica 8 booli

Poniższy kod pokazuje możliwość wykorzystania char jako tablicy ośmio bitowej. Trzeba tylko pamiętać, że get zwraca bity w 'odwrotnej' kolejności (przynajmniej w stosunku do tej, do której ja przywykłem, ale łatwo to zmienić, a mi akurat tak było wygodniej :) ), czyli mniej~więcej tak:
pozycja:| 0 | 1| 2| 3| 4| 5| 6| 7|
--------+---+--+--+--+--+--+--+--+
wartość:|128|64|32|16| 8| 4| 2| 1| 


bool get(char a, int pos)
{
char bit = 1;
for(register int i=pos; i>0; i--)bit*=2;//potęga :)
return (a&bit);
}
//--------------------
void set(char &a, int &pos, bool &stan)
{
char bit = 1;
for(register int i=pos; i>0; i--)bit*=2;//potęgowanie :)
if(stan==0)
a&=(~bit);
else
a|=bit;
}


Myślę, że set() można by było poprawić, przez zlikwidowanie tego if`a, ale ja jakoś zupełnie nie mam pomysłu jak...

PS> to moje początki z arytmetyką logiczną, więc się nie śmiać :)

2 komentarze

flabra 2003-12-24 09:50

Albo tak:

void set(char& val,char pos, char stan){
  val=(val&(~(1<<pos)))|((stan&1)<<pos)
}
 
// albo tak:
 
#define setbit(buf,bit,newstate) (((buf)&=(~(((newstate)<<(bit)))))|=(((newstate)<<(bit))))
// z tego najchetniej korzystam
 
#define getbit(buf,bit) (((buf)>>(bit))&1) // i z tego

Właściwie to samo, ale jednak czysta arytmetyka, bez sprawdzania warunków.

Marooned 2003-12-23 15:04

Nie wiem, dlaczego odwróciłeś numery bitów - zwyczajowo bit nr 0 jest najmniej znaczącym - a więc o wartości 1, a nie jak u Ciebie 128.

Moje wersje tych funkcji (przyjmując standarwową kolejność bitów: 0=1, ..., 7=128):

bool get(char a, char pos)
{return (a&(1<<pos));
}
 
//--------------------
 
void set(char &a, char pos, bool stan)
{(stan)?a|=(1<<pos):a&=~(1<<pos);
}


Czyż nie prościej?