Něco jen vážně pro fajšmekry

Z55

Něco jen vážně pro fajšmekry
« kdy: 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


oooo

Re:Něco jen vážně pro fajšmekry
« Odpověď #1 kdy: 26. 11. 2015, 22:39:20 »
A s čím máš problém? Data budou rovou v té proměnné?

Z55

Re:Něco jen vážně pro fajšmekry
« Odpověď #2 kdy: 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.

Pavel Tisnovsky

Re:Něco jen vážně pro fajšmekry
« Odpověď #3 kdy: 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.



Z55

Re:Něco jen vážně pro fajšmekry
« Odpověď #5 kdy: 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

Pavel Tisnovsky

Re:Něco jen vážně pro fajšmekry
« Odpověď #6 kdy: 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ší :-)

hu

Re:Něco jen vážně pro fajšmekry
« Odpověď #7 kdy: 26. 11. 2015, 23:11:48 »
...sudé bity pro index, liché pro hodnotu...

Ježkovy, kdo to má pak sesypávat dohromady? :-)

Pavel Tisnovsky

Re:Něco jen vážně pro fajšmekry
« Odpověď #8 kdy: 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 :-)

Z55

Re:Něco jen vážně pro fajšmekry
« Odpověď #9 kdy: 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

hmmmmm

Re:Něco jen vážně pro fajšmekry
« Odpověď #10 kdy: 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.

Pavel Tisnovsky

Re:Něco jen vážně pro fajšmekry
« Odpověď #11 kdy: 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

hmmmmm

Re:Něco jen vážně pro fajšmekry
« Odpověď #12 kdy: 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)

Z55

Re:Něco jen vážně pro fajšmekry
« Odpověď #13 kdy: 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


Z55

Re:Něco jen vážně pro fajšmekry
« Odpověď #14 kdy: 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č ?