C/C++ FAQ

Char jako tablica 8 booli

Krecik

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ć :)

FAQ

2 komentarzy

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.

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?