Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Z55 26. 11. 2015, 22:34:15
-
Ahoj, představte si, že potřebujete předat nějaký index a hodnotu do pole přes nějakou proměnnou. Jenže máte k dispozici pouze a jenom jednu možnost jak takové data odeslat a to je, že můžete odeslat pouze čísla, žádný text, žádná tečka, čárka prostě nic. Eexistuje přesto nějaké řešení jak to udělat ? Díky
-
A s čím máš problém? Data budou rovou v té proměnné?
-
Ano, přímo v té proměnné. V čem je problém ? No jak napsat do jedné proměnné index a hodnotu aby to šlo odlišit.
-
Ano, přímo v té proměnné. V čem je problém ? No jak napsat do jedné proměnné index a hodnotu aby to šlo odlišit.
Pokud znáš maximální rozsah indexu, tak hodnota*(rozsah+1)+index
Pokud neznáš, tak například sudé bity pro index, liché pro hodnotu, ale podle mě ten rozsah znáš, takže si spočítej, jestli ti to nepřeteče atd.atd.
-
http://stackoverflow.com/questions/9501508/encode-a-string-into-a-biginteger-then-decode-back-to-string ?
-
Pokud znáš maximální rozsah indexu, tak hodnota*(rozsah+1)+index
Pokud neznáš, tak například sudé bity pro index, liché pro hodnotu, ale podle mě ten rozsah znáš, takže si spočítej, jestli ti to nepřeteče atd.atd.
Pavle moc nerozumím jak to myslíš, můžeš to upřesnit ? Díky
-
Pokud znáš maximální rozsah indexu, tak hodnota*(rozsah+1)+index
Pokud neznáš, tak například sudé bity pro index, liché pro hodnotu, ale podle mě ten rozsah znáš, takže si spočítej, jestli ti to nepřeteče atd.atd.
Pavle moc nerozumím jak to myslíš, můžeš to upřesnit ? Díky
Jasně :-) Pokud například víš, že maximální hodnota indexu bude 10000, pak můžeš spočítat:
výsledek = hodnota*10001 + index
a budeš mít jistotu, že ať je index jakýkoli od 0 do toho 10000, tak neovlivní vyšší část toho výsledku.
Problémy jsou dva:
1) nemusíš max index znát
2) výsledek může přetéct přes maximální reprezentovatelnou hodnotu - tady záleží, kde se to použije, zda můžeš počítat s 64bitovými čísly, delšími čísly atd.
Druhá možnost byla myšlena tak, když neznáš rozsahy. Potom se může například obě vstupní čísla mohou převést do
binární podoby a jednotlivé bity smíchat do výsledku stylem sudý bit - bit z indexu, lichý bit - bit z druhé hodnoty.
Zase - může to přetéct, je to komplikovanější, ale zajímavější :-)
-
...sudé bity pro index, liché pro hodnotu...
Ježkovy, kdo to má pak sesypávat dohromady? :-)
-
...sudé bity pro index, liché pro hodnotu...
Ježkovy, kdo to má pak sesypávat dohromady? :-)
tak ať si to rozdělí po bajtech, to je už jedno :-)
-
Díky moc, maximální index znám, arr[0] - arr[ 99] to mi stačí a hodnota by teoreticky stačila s délkou 5-6 číslic. A teď vím, že potřebuji naplnit
arr[10] = 12345
což bude binárně 1010 a 11000000111001
a teď to mám spojit ? 101011000000111001
-
unsigned int foo = value;
foo <<= INDEX_BIT_COUNT;
foo |= index;
nebo pokud mate k dispozici pole cisel tak to vasi hodnotu zkonvertovat na pole unsigned long long int, prenist to, a pole pretypovat na puvodni typ.
-
Díky moc, maximální index znám, arr[0] - arr[ 99] to mi stačí a hodnota by teoreticky stačila s délkou 5-6 číslic. A teď vím, že potřebuji naplnit
arr[10] = 12345
což bude binárně 1010 a 11000000111001
a teď to mám spojit ? 101011000000111001
Pokud znáš maximální index, tak stačí:
výsledek = hodnota * 100 + index
a nemusíš si hrát s bitíky
potom na druhé straně:
index = přijatá_hodnota % 100
hodnota = přijatá_hodnota / 100
-
Díky moc, maximální index znám, arr[0] - arr[ 99] to mi stačí a hodnota by teoreticky stačila s délkou 5-6 číslic. A teď vím, že potřebuji naplnit
arr[10] = 12345
což bude binárně 1010 a 11000000111001
a teď to mám spojit ? 101011000000111001
Tak to je jednoduché.
foo |= hodnota << 16;
foo |= index;
hodnota = foo >> 16;
index = foo & (2^16-1)
-
To Pavel Tisnovsky
něco dělám blbě...
//co pozaduji
array[10] = 123456;
výsledek = 123456 * 100 + 10 //12346312
index = výsledek % 100 //12
hodnota = výsledek / 100 //123463,12
-
Zle počítám, už to funguje ;-) Neuvěřitelné, může nastat nějaká krpa ? V prvním příkladu jsi použil násobek 10001 místo 10000, proč ?
-
Pokial to potrebujes v c/c++ idealne by bolo pouzit union:
union tuple_union{
struct {
__int16_t idx;
__int16_t val;
} as_tuple;
__int32_t as_single_number;
};
mozes potom k rovnakym datam pristupovat pohodlne ako k dvojici 16 bitovych intov a zaroven jednemu 32 bitovemu intu...
-
Zle počítám, už to funguje ;-) Neuvěřitelné, může nastat nějaká krpa ? V prvním příkladu jsi použil násobek 10001 místo 10000, proč ?
Protože jsem počítal s max. hodnotou indexu 10000
V Tvém případě máš maximální hodnotu indexu 99, takže se použije konstanta o jedničku větší (jde o to, že i když použiješ max.index, nesmí dojít ke zvětšení hodnoty vynásobené o tu stovku).
-
Pokial to potrebujes v c/c++ idealne by bolo pouzit union:
union tuple_union{
struct {
__int16_t idx;
__int16_t val;
} as_tuple;
__int32_t as_single_number;
};
mozes potom k rovnakym datam pristupovat pohodlne ako k dvojici 16 bitovych intov a zaroven jednemu 32 bitovemu intu...
Nie pohodlne. Endian, takze ani na 100% nevies, ci je idx prvy alebo druhy a ci nema prehodene byty.
-
Druhá možnost byla myšlena tak, když neznáš rozsahy. Potom se může například obě vstupní čísla mohou převést do
binární podoby a jednotlivé bity smíchat do výsledku stylem sudý bit - bit z indexu, lichý bit - bit z druhé hodnoty.
Nefunguje pro signed integer. Unsigned integer funguje.
Nie pohodlne. Endian, takze ani na 100% nevies, ci je idx prvy alebo druhy a ci nema prehodene byty.
Bude to fungovat za přirozeného předpokladu že big-endian slepé evoluční větve nesmí přes práh :)
-
Pokial to potrebujes v c/c++ idealne by bolo pouzit union:
union tuple_union{
struct {
__int16_t idx;
__int16_t val;
} as_tuple;
__int32_t as_single_number;
};
mozes potom k rovnakym datam pristupovat pohodlne ako k dvojici 16 bitovych intov a zaroven jednemu 32 bitovemu intu...
Nie pohodlne. Endian, takze ani na 100% nevies, ci je idx prvy alebo druhy a ci nema prehodene byty.
Nevidim problem preco by si to nemohol pouzit na little aj big endian systemoch - jediny problem by bol samozrejme pokial by si tie data prenasal medzi systemami s roznou endianitou.
-
Mnohem jistejsi a vic koser bude, pokud to deklarujes jako skupinu bytu. Pak je to jedno, protoze "indiana" zaskrtis vlastnorucne ;D.