Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Z55 26. 11. 2015, 22:34:15

Název: Něco jen vážně pro fajšmekry
Přispěvatel: 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
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: oooo 26. 11. 2015, 22:39:20
A s čím máš problém? Data budou rovou v té proměnné?
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: Z55 26. 11. 2015, 22:41:28
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.
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: Pavel Tisnovsky 26. 11. 2015, 22:57:27
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.
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: dustin 26. 11. 2015, 22:58:19
http://stackoverflow.com/questions/9501508/encode-a-string-into-a-biginteger-then-decode-back-to-string ?
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: Z55 26. 11. 2015, 23:03:48

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
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: Pavel Tisnovsky 26. 11. 2015, 23:10:17

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ší :-)
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: hu 26. 11. 2015, 23:11:48
...sudé bity pro index, liché pro hodnotu...

Ježkovy, kdo to má pak sesypávat dohromady? :-)
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: Pavel Tisnovsky 26. 11. 2015, 23:13:03
...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 :-)
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: Z55 26. 11. 2015, 23:22:42
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
Kód: [Vybrat]
arr[10] = 12345což bude binárně 1010 a 11000000111001
a teď to mám spojit ? 101011000000111001
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: hmmmmm 26. 11. 2015, 23:29:45
Kód: [Vybrat]
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.
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: Pavel Tisnovsky 26. 11. 2015, 23:31:38
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
Kód: [Vybrat]
arr[10] = 12345což 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
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: hmmmmm 26. 11. 2015, 23:35:54
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
Kód: [Vybrat]
arr[10] = 12345což bude binárně 1010 a 11000000111001
a teď to mám spojit ? 101011000000111001
Tak to je jednoduché.
Kód: [Vybrat]
foo |= hodnota << 16;
foo |= index;
hodnota = foo >> 16;
index = foo & (2^16-1)
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: Z55 26. 11. 2015, 23:45:22
To Pavel Tisnovsky

něco dělám blbě...
//co pozaduji
Kód: [Vybrat]
array[10] = 123456;

výsledek = 123456  * 100 + 10 //12346312

index   = výsledek % 100 //12
hodnota = výsledek / 100 //123463,12

Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: Z55 27. 11. 2015, 00:07:07
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č ?
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: johnys 27. 11. 2015, 00:15:46
Pokial to potrebujes v c/c++ idealne by bolo pouzit union:

Kód: [Vybrat]
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...
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: Pavel Tisnovsky 27. 11. 2015, 00:17:31
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).
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: adsafsdf 27. 11. 2015, 01:20:25
Pokial to potrebujes v c/c++ idealne by bolo pouzit union:

Kód: [Vybrat]
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.
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: k 27. 11. 2015, 08:28:55
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 :)
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: johnys 27. 11. 2015, 17:17:25
Pokial to potrebujes v c/c++ idealne by bolo pouzit union:

Kód: [Vybrat]
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.
Název: Re:Něco jen vážně pro fajšmekry
Přispěvatel: j 27. 11. 2015, 18:00:18
Mnohem jistejsi a vic koser bude, pokud to deklarujes jako skupinu bytu. Pak je to jedno, protoze "indiana" zaskrtis vlastnorucne ;D.