Hej,
Potrzebny mi jest typ danych na liczby całkowite, bez znaku, do zapisania na 3 bajtach, czyli 24 bitach.
Muszę móc na nim zapisać wartość, odczytać wartość i dodać 1.
Czy jest jakaś prosta metoda na stworzenie czegoś takiego?
Korzystaj z int
(zakładając, że ma co najmniej 3 bajty) i obcinaj zbędne bity.
Ze co brakuje pamięci przy normalnych int'ach ?
A jak to zrobić? Czy int po takiej operacji będzie realnie w pamięci zajmował 3 bajty?
Tak, mam zapisać liczbę np 16 003 789 mieszcząc się na 3 bajtach realnie zajmowanej pamięci, takie zadanie "optymalizacyjne".
Wydaje mi się, że pola bitowe (http://pl.wikipedia.org/wiki/Pole_bitowe) powinny rozwiązać twój problem, choć nie jestem pewny w 100%.
Przykładowe rozwiązanie:
int main(int argc, char **argv)
{
struct {
unsigned int value:24;
} your_variable;
return 0;
}
kamilwxx napisał(a):
int main(int argc, char **argv)
{
struct {
unsigned int value:24;
} your_variable;
return 0;
}
Pudło - http://ideone.com/tVY1Nk
Ok, czyli wygląda na to że będzie trzeba kombinować z przesunięciami na tablicy char'ów.
class int24
{
unsigned char tb[3];
public:
explicit int24(unsigned value) { memcpy(tb,&value,3); }
operator unsigned()const { unsigned value=0; memcpy(&value,tb,3); return value; }
int24 &operator++() { unsigned value=0; memcpy(&value,tb,3); ++value; memcpy(tb,&value,3); return *this; }
};
Uwaga tylko dla Little Endian
Jakie to oszczędzanie pamięci, skoro narzucasz dodatkowe kilkadziesiąt~kilkaset bajtów związanych z alokacją obiektu per każdy taki uint24_t
?
możesz sobie zrobić strukturę trzech bajtów i skorzystać z unii żeby łatwo modyfikować wartości bez żadnych przesunięć bitowych
Patryk27 napisał(a):
kamilwxx napisał(a):
int main(int argc, char **argv)
{
struct {
unsigned int value:24;
} your_variable;
return 0;
}
Pudło - http://ideone.com/tVY1Nk
Mówisz http://ideone.com/XPAmb2
Cudo, mogę to zapisać jako jakiś typ czy każdy obiekt musiałbym podobnie tworzyć?
Możesz to połączyć z tym co ja podałem, w wyniku otrzymasz znacznie zgrabniejszy kod, tylko że __attribute__ ((__packed__))
nie jest częścią standardu więc pod jednym kompilatorem zadziała pod drugim nie.