JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?

1. Potreboval by som do jedného čísla dostať 2 čísla s polovičnou veľkosťou.

Kedysi v Delphi sa dalo jedno 32 bitové číslo  rozdeliť na dve 16 bitové (funkcie Hi a Lo). Ako sa to robí v JS? Pomocou bitových posuvov? Viete mi dať prosím príklad? Aj na spojenie aj na rozdelenie.

Ale ak by sa dalo tak 2  32 bitové čísla spojiť na jedno 64 bitové. a poprosil by som nejaký najefektívnejší spôsob.

2. druhá otázka je k číselným typom v JS. JS má len jeden číslený typ number a to je alternatíva k typu float alebo decimal?


Re:JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?
« Odpověď #1 kdy: 01. 05. 2019, 00:43:17 »
Kedysi v Delphi sa dalo jedno 32 bitové číslo  rozdeliť na dve 16 bitové (funkcie Hi a Lo). Ako sa to robí v JS? Pomocou bitových posuvov? Viete mi dať prosím príklad? Aj na spojenie aj na rozdelenie.
Dá se to udělat pomocí bitového posunu: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators A nebo pomocí dělení a zbytku po dělení.

Ale ak by sa dalo tak 2  32 bitové čísla spojiť na jedno 64 bitové. a poprosil by som nejaký najefektívnejší spôsob.
Bitové posuvy se v JavaScriptu dělají nad 32bitovými čísly, a typ Number je 64bitový double. Takže byste to musel implementovat pomocí Stringl nebo ArrayBufferu.

Efektivitu v tomhle případě nemá smysl řešit. Za prvé tu operaci asi nebudete provádět moc často, když to děláte v JavaScriptu. Za druhé jste v JavaScriptu moc daleko od strojového kódu. Dnešní „interprety“ JavaScriptu v prohlížečích dělají JIT (Just-in-time) kompilaci do strojového kódu – buď ten kompilátor pochopí, o co vám jde, a přeloží to efektivně, nebo to nepochopí. To ale vůbec nezáleží na tom, jak „efektivně“ to bude napsané, ale jenom na tom, zda rozpozná vzor, který jste použil.

https://tc39.github.io/ecma262/#sec-ecmascript-language-types-number-type

2. druhá otázka je k číselným typom v JS. JS má len jeden číslený typ number a to je alternatíva k typu float alebo decimal?
Je to alternativa k double.

Ale upřímně řečeno, je dost divné, že chcete takovéhle operace provádět v JavaScriptu a navíc pomocí typu Number. Bylo by lepší, kdybyste popsal, jaký problém řešíte, protože je dost pravděpodobné, že jste zvolil nevhodné řešení.

Re:JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?
« Odpověď #2 kdy: 01. 05. 2019, 15:03:46 »
...

Ahoj ďakujem za odpoveď.

Potrebujem to mať v JS keďže v prehliadači sa nedá okrem JS použiť nič iné. Robím si vlastnú implementáciu 2D dynamickej kolekcie (niečo ako 2d array) ktorá by sa mala automaticky rozširovať v dvoch osiach (X,Y) a do kladných aj do záporných hodnôt. Pôvodne som chcel použiť pole polí ale to nebolo moc flexibilné... Moja kolekcia bude obalovať  obyćajný  Map do ktorého potrebujem ako key použiť Xovú a Ylonovú súradnicu a k súradnici potom len priradiť hodnotu. A keďže key je len jedena value tak neviem ako mám do nej vložiť obidve hodnoty tak aby som ich vedel za behu rýchlo spájať a rozdeľovať. Možno som len niečo nedomyslel ak máš iný nápad ako to urobiť budem veľmi rád keď ma ním inšpiruješ.

Re:JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?
« Odpověď #3 kdy: 01. 05. 2019, 15:12:25 »
A k tomu čo si mi napísal som si niečo vygooglil otázka je nakoľko je to rýchle a efektívne:

Kód: [Vybrat]
const buffer = new ArrayBuffer(8);
(new Uint32Array(buffer))[0] = 120; //x
(new Uint32Array(buffer))[1] = 30;   //y
const float64Key = (new Float64Array(buffer))[0];

Re:JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?
« Odpověď #4 kdy: 01. 05. 2019, 15:19:51 »
A ospravedlňujem sa Vám za tykanie zabudol som že tu na roote sa zvykne v diskusiách vykať.


gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?
« Odpověď #5 kdy: 01. 05. 2019, 15:25:47 »
...

Ahoj ďakujem za odpoveď.

Potrebujem to mať v JS keďže v prehliadači sa nedá okrem JS použiť nič iné. Robím si vlastnú implementáciu 2D dynamickej kolekcie (niečo ako 2d array) ktorá by sa mala automaticky rozširovať v dvoch osiach (X,Y) a do kladných aj do záporných hodnôt. Pôvodne som chcel použiť pole polí ale to nebolo moc flexibilné... Moja kolekcia bude obalovať  obyćajný  Map do ktorého potrebujem ako key použiť Xovú a Ylonovú súradnicu a k súradnici potom len priradiť hodnotu. A keďže key je len jedena value tak neviem ako mám do nej vložiť obidve hodnoty tak aby som ich vedel za behu rýchlo spájať a rozdeľovať. Možno som len niečo nedomyslel ak máš iný nápad ako to urobiť budem veľmi rád keď ma ním inšpiruješ.

udelej z toho string.

Kód: [Vybrat]
m[String([x,y])] = val;

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?
« Odpověď #6 kdy: 01. 05. 2019, 16:35:55 »
Potrebujem to mať v JS keďže v prehliadači sa nedá okrem JS použiť nič iné. Robím si vlastnú implementáciu 2D dynamickej kolekcie (niečo ako 2d array) ktorá by sa mala automaticky rozširovať v dvoch osiach (X,Y) a do kladných aj do záporných hodnôt. Pôvodne som chcel použiť pole polí ale to nebolo moc flexibilné... Moja kolekcia bude obalovať  obyćajný  Map do ktorého potrebujem ako key použiť Xovú a Ylonovú súradnicu a k súradnici potom len priradiť hodnotu. A keďže key je len jedena value tak neviem ako mám do nej vložiť obidve hodnoty tak aby som ich vedel za behu rýchlo spájať a rozdeľovať. Možno som len niečo nedomyslel ak máš iný nápad ako to urobiť budem veľmi rád keď ma ním inšpiruješ.

Použij komplexní čísla, dostaneš k nim i matematické nástroje.
https://mathjs.org/docs/datatypes/complex_numbers.html

Re:JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?
« Odpověď #7 kdy: 01. 05. 2019, 16:49:19 »
Potrebujem to mať v JS keďže v prehliadači sa nedá okrem JS použiť nič iné. Robím si vlastnú implementáciu 2D dynamickej kolekcie (niečo ako 2d array) ktorá by sa mala automaticky rozširovať v dvoch osiach (X,Y) a do kladných aj do záporných hodnôt. Pôvodne som chcel použiť pole polí ale to nebolo moc flexibilné... Moja kolekcia bude obalovať  obyćajný  Map do ktorého potrebujem ako key použiť Xovú a Ylonovú súradnicu a k súradnici potom len priradiť hodnotu. A keďže key je len jedena value tak neviem ako mám do nej vložiť obidve hodnoty tak aby som ich vedel za behu rýchlo spájať a rozdeľovať. Možno som len niečo nedomyslel ak máš iný nápad ako to urobiť budem veľmi rád keď ma ním inšpiruješ.
Když použijete normální mapu v mapě, má to nedostatečný výkon? Je to jenom můj odhad, ale použitím jedné mapy místo  mapy map podle mne zásadní nárůst výkonu nezískáte.

Mapa v JavaScriptu má jako klíče stringy, takže je nesmysl pokoušet se tam něco složitě zakódovat do čísla. Pokud by skutečně bylo efektivnější použít jednu mapu, ta dvě čísla prostě rovnou spojte do jednoho Stringu.

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?
« Odpověď #8 kdy: 01. 05. 2019, 17:31:58 »
Potrebujem to mať v JS keďže v prehliadači sa nedá okrem JS použiť nič iné. Robím si vlastnú implementáciu 2D dynamickej kolekcie (niečo ako 2d array) ktorá by sa mala automaticky rozširovať v dvoch osiach (X,Y) a do kladných aj do záporných hodnôt. Pôvodne som chcel použiť pole polí ale to nebolo moc flexibilné... Moja kolekcia bude obalovať  obyćajný  Map do ktorého potrebujem ako key použiť Xovú a Ylonovú súradnicu a k súradnici potom len priradiť hodnotu. A keďže key je len jedena value tak neviem ako mám do nej vložiť obidve hodnoty tak aby som ich vedel za behu rýchlo spájať a rozdeľovať. Možno som len niečo nedomyslel ak máš iný nápad ako to urobiť budem veľmi rád keď ma ním inšpiruješ.

Použij komplexní čísla, dostaneš k nim i matematické nástroje.
https://mathjs.org/docs/datatypes/complex_numbers.html

to nebude fungovat.

Re:JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?
« Odpověď #9 kdy: 01. 05. 2019, 18:32:34 »
udelej z toho string.

Pôvodne som to mal ako string. Lenže predstavte si že chcete napríklad získať všetky hodnoty vo vnútri obdĺžnika, ktorý je definovaný dvomi súradnicami xy - príklad:

Kód: [Vybrat]
const values = dynamic2dCollection.getRectValuesBetween({ x: 10, y: 20},  {x: 50, y: 50})
A na to potrebujete v cykle prejsť celú mapu a vždy každý key rozdeliť na pole

Kód: [Vybrat]
const posXY = key.split(',')
obidva prvky pola skonvertovať na number a až potom testovať či sa pozícia nachádza niekde medzi súradnicami. A intuitícia mi hovorí že operácie nad stringom a konverzia na number by boli rádovo pomalšie ako rozdelenie 64bit čísla na dve 32 bitové.

Citace: Filip Jirsák
Mapa v JavaScriptu má jako klíče stringy, takže je nesmysl pokoušet se tam něco složitě zakódovat do čísla. Pokud by skutečně bylo efektivnější použít jednu mapu, ta dvě čísla prostě rovnou spojte do jednoho Stringu.

vy máte asi namysli js plain objekt použitý ako mapu. Ten používa iba stringové kľúče. Ale dnes už Javascript obsahuje aj špeciálnu kolekciu Map https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
Tá funguje aj s číselnými kľúčmi (a nekonvertuje ich na string):

Kód: [Vybrat]
const mapa = new Map();
mapa.set(5.6, 'priradená hodnota')
console.log('správny typ kľúča', mapa.get(5.6)) // vráti 'priradená hodnota';
console.log('nesprávny typ kľúča', mapa.get('5.6')); // vráti undefined

Citace: Filip Jirsák
Když použijete normální mapu v mapě, má to nedostatečný výkon? Je to jenom můj odhad, ale použitím jedné mapy místo  mapy map podle mne zásadní nárůst výkonu nezískáte.

Stál som si na kábli, máte pravdu mapa máp je najpriamočiarejšie riešenie ďakujem Vám za tip.

Re:JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?
« Odpověď #10 kdy: 01. 05. 2019, 19:23:33 »
Pôvodne som to mal ako string. Lenže predstavte si že chcete napríklad získať všetky hodnoty vo vnútri obdĺžnika, ktorý je definovaný dvomi súradnicami xy - príklad:

Kód: [Vybrat]
const values = dynamic2dCollection.getRectValuesBetween({ x: 10, y: 20},  {x: 50, y: 50})
A na to potrebujete v cykle prejsť celú mapu a vždy každý key rozdeliť na pole
Proč potřebujete projít celou mapu? Proč neprojdete jenom hodnoty uvnitř toho obdélníku?

A intuitícia mi hovorí že operácie nad stringom a konverzia na number by boli rádovo pomalšie ako rozdelenie 64bit čísla na dve 32 bitové.
Vyhněte se předčasným optimalizacím na základě intuice. Většinou to situaci akorát zhorší.

vy máte asi namysli js plain objekt použitý ako mapu. Ten používa iba stringové kľúče. Ale dnes už Javascript obsahuje aj špeciálnu kolekciu Map https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
Tá funguje aj s číselnými kľúčmi (a nekonvertuje ich na string):
Pořád je to ale hash mapa. Nemyslím si, že byste poznal rozdíl v tom, zda máte jako klíče texty nebo čísla.

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?
« Odpověď #11 kdy: 01. 05. 2019, 19:29:30 »
udelej z toho string.

Pôvodne som to mal ako string. Lenže predstavte si že chcete napríklad získať všetky hodnoty vo vnútri obdĺžnika, ktorý je definovaný dvomi súradnicami xy - príklad:

Kód: [Vybrat]
const values = dynamic2dCollection.getRectValuesBetween({ x: 10, y: 20},  {x: 50, y: 50})
A na to potrebujete v cykle prejsť celú mapu a vždy každý key rozdeliť na pole

Kód: [Vybrat]
const posXY = key.split(',')
obidva prvky pola skonvertovať na number a až potom testovať či sa pozícia nachádza niekde medzi súradnicami. A intuitícia mi hovorí že operácie nad stringom a konverzia na number by boli rádovo pomalšie ako rozdelenie 64bit čísla na dve 32 bitové.

Citace: Filip Jirsák
Mapa v JavaScriptu má jako klíče stringy, takže je nesmysl pokoušet se tam něco složitě zakódovat do čísla. Pokud by skutečně bylo efektivnější použít jednu mapu, ta dvě čísla prostě rovnou spojte do jednoho Stringu.

vy máte asi namysli js plain objekt použitý ako mapu. Ten používa iba stringové kľúče. Ale dnes už Javascript obsahuje aj špeciálnu kolekciu Map https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
Tá funguje aj s číselnými kľúčmi (a nekonvertuje ich na string):

Kód: [Vybrat]
const mapa = new Map();
mapa.set(5.6, 'priradená hodnota')
console.log('správny typ kľúča', mapa.get(5.6)) // vráti 'priradená hodnota';
console.log('nesprávny typ kľúča', mapa.get('5.6')); // vráti undefined

Citace: Filip Jirsák
Když použijete normální mapu v mapě, má to nedostatečný výkon? Je to jenom můj odhad, ale použitím jedné mapy místo  mapy map podle mne zásadní nárůst výkonu nezískáte.

Stál som si na kábli, máte pravdu mapa máp je najpriamočiarejšie riešenie ďakujem Vám za tip.

v takovem use case by bylo lepsi pouzit k-d tree. Konverze stringu je ten mensi problem.

Re:JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?
« Odpověď #12 kdy: 01. 05. 2019, 19:43:43 »
v takovem use case by bylo lepsi pouzit k-d tree. Konverze stringu je ten mensi problem.
V případě, že chce ukládat hodnoty pouze pro menšinu bodů z celého prostoru. Já jsem zadání fortran1986 nepochopil tak, že chce řídké pole, ale že pro zadaný rozsah klíčů bude pole plné.

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:JS - Zakódovanie dvoch čísel do jedného a spatné odkódovanie?
« Odpověď #13 kdy: 01. 05. 2019, 20:36:37 »
v takovem use case by bylo lepsi pouzit k-d tree. Konverze stringu je ten mensi problem.
V případě, že chce ukládat hodnoty pouze pro menšinu bodů z celého prostoru. Já jsem zadání fortran1986 nepochopil tak, že chce řídké pole, ale že pro zadaný rozsah klíčů bude pole plné.

tak potom je lepsi pouzit normalni pole a pri zvetseni ho prealokovat.