Bitové operace ve vyšších jazycích

gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #315 kdy: 09. 09. 2016, 14:16:02 »
Kód: [Vybrat]
>>> timeit('x=2;x ** 10',number=10**8)
55.42527198791504
>>> timeit('x=1;x << 10',number=10**8)
15.809034824371338

Bavíme se o speciálním případu, 2 ** x a 1 << x. Spíš by mě zajímal reálný kód, kde na rychlosti téhle operace záleží.


gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #316 kdy: 09. 09. 2016, 14:18:59 »
Ano můžu. Pro celočíselné x to vrací vždy stejný výsledek.

Ne nemůžeš, protože nevíš, jakého je x typu. Stejnou chybu jsi udělal už tady a bohužel jsi to pořád nepochopil:
http://forum.root.cz/index.php?topic=13803.msg177901#msg177901
chtěl jsi nahradit
Kód: [Vybrat]
x = np.arange(0, N * (1 << J), dtype=float) / (1 << J)
tímto:
Kód: [Vybrat]
x = np.arange(0, N * 2 ** J, dtype=float) / (2 ** J)

ale to NESMÍŠ, protože ten kód ROZBIJEŠ. Z funkčního kódu jsi udělal kód nefunkční. To J tam chodí zvenku:
https://github.com/scipy/scipy/blob/master/scipy/signal/wavelets.py#L96
a MUSÍ to být integer. Tady nejde o žádné optimalizace rychlosti, tady jde o to, že operátory << a ** NELZE jen tak zaměňovat. Zkus se nad tím prosím zamyslet. Je smutné, když programátor rozbije fukční kód jen proto, že něco nepochopil.

Takže potřebuješ i speciální operátor +, který bere jen celá čísla? Pokud potřebuješ kontrolovat typ, máš jiné možnosti.


gamer

Re:Bitové operace ve vyšších jazycích
« Odpověď #317 kdy: 09. 09. 2016, 14:22:16 »
Takže potřebuješ i speciální operátor +, který bere jen celá čísla? Pokud potřebuješ kontrolovat typ, máš jiné možnosti.

Nepotřebuju, + je definováno jak pro float tak pro integer. Bitový posun je definovaný jen pro integer. Čemu na tom pořád nerozumíš? Pokusím se to vysvětlit nějak jinak...

v

Re:Bitové operace ve vyšších jazycích
« Odpověď #318 kdy: 09. 09. 2016, 14:26:14 »
docela by mě zajímalo, jak se to přihodilo, že se diskuze točí prakticky výhradně kolem použití posunu doleva pro optimalizaci násobení 2**n

javaman ((

Re:Bitové operace ve vyšších jazycích
« Odpověď #319 kdy: 09. 09. 2016, 14:29:33 »
Přesně :D


gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #320 kdy: 09. 09. 2016, 14:33:19 »
docela by mě zajímalo, jak se to přihodilo, že se diskuze točí prakticky výhradně kolem použití posunu doleva pro optimalizaci násobení 2**n

Protože jediná ukázka reálného kódu, kterou tu někdo poslal, používala << pro výpočet mocniny dvou u nějaké hodnoty. Jen jednou za celé volání funkce. Podle místních expertů je to veledůležitá optimalizace.

gamer

Re:Bitové operace ve vyšších jazycích
« Odpověď #321 kdy: 09. 09. 2016, 14:34:29 »
docela by mě zajímalo, jak se to přihodilo, že se diskuze točí prakticky výhradně kolem použití posunu doleva pro optimalizaci násobení 2**n

Díváš se na to úplně opačně. Operátor logického posunu se v pythonu nepoužívá pro optimalizaci 2**n. V pythonu to nemá žádný smysl, protože je obojí stejně rychlé. Operátor logického posunu se v pythonu používá, protože dělá něco jiného než 2**n. Kdyby dělal to stejné, nemělo by smysl mít dva různé operátory. Je potřeba umět rozhodnout, kdy a na co se má který operátor použít. Tento thread dokazuje, že to zjevně není triviální problém a spousta lidí s tím má potíže...

Kit

Re:Bitové operace ve vyšších jazycích
« Odpověď #322 kdy: 09. 09. 2016, 14:35:56 »
Kód: [Vybrat]
>>> timeit('x=2;x ** 10',number=10**8)
55.42527198791504
>>> timeit('x=1;x << 10',number=10**8)
15.809034824371338

Bavíme se o speciálním případu, 2 ** x a 1 << x. Spíš by mě zajímal reálný kód, kde na rychlosti téhle operace záleží.

Asi bych se nerozhodoval kvůli rychlosti, ale kvůli sémantice. Někdy potřebuji násobení nebo umocňování, jindy bitový posun.

gamer

Re:Bitové operace ve vyšších jazycích
« Odpověď #323 kdy: 09. 09. 2016, 14:39:12 »
Asi bych se nerozhodoval kvůli rychlosti, ale kvůli sémantice. Někdy potřebuji násobení nebo umocňování, jindy bitový posun.
Přesně tak.

v

Re:Bitové operace ve vyšších jazycích
« Odpověď #324 kdy: 09. 09. 2016, 14:39:35 »
docela by mě zajímalo, jak se to přihodilo, že se diskuze točí prakticky výhradně kolem použití posunu doleva pro optimalizaci násobení 2**n

Díváš se na to úplně opačně. Operátor logického posunu se v pythonu nepoužívá pro optimalizaci 2**n. V pythonu to nemá žádný smysl, protože je obojí stejně rychlé. Operátor logického posunu se v pythonu používá, protože dělá něco jiného než 2**n. Kdyby dělal to stejné, nemělo by smysl mít dva různé operátory. Je potřeba umět rozhodnout, kdy a na co se má který operátor použít. Tento thread dokazuje, že to zjevně není triviální problém a spousta lidí s tím má potíže...
to jste jen jinými slovy popsal to na co jsem upozorňoval, bitové operace mají úplně jiný smysl než pochybnou optimalizaci, někdo tu poukazoval na bitové pole v pythonu a já jsem zmiňoval třeba base64

gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #325 kdy: 09. 09. 2016, 14:41:08 »
docela by mě zajímalo, jak se to přihodilo, že se diskuze točí prakticky výhradně kolem použití posunu doleva pro optimalizaci násobení 2**n

Díváš se na to úplně opačně. Operátor logického posunu se v pythonu nepoužívá pro optimalizaci 2**n. V pythonu to nemá žádný smysl, protože je obojí stejně rychlé. Operátor logického posunu se v pythonu používá, protože dělá něco jiného než 2**n. Kdyby dělal to stejné, nemělo by smysl mít dva různé operátory. Je potřeba umět rozhodnout, kdy a na co se má který operátor použít. Tento thread dokazuje, že to zjevně není triviální problém a spousta lidí s tím má potíže...

Pokud chceš posouvat, použiješ posun. Pokud chceš spočítat mocninu 2, můžeš použít umocňování i posun. Posun je asi rychlejší, umocňování je explicitnější a pro přepis matematického vzorce IMHO vhodnější.

ByCzech

  • *****
  • 1 848
    • Zobrazit profil
    • E-mail
Re:Bitové operace ve vyšších jazycích
« Odpověď #326 kdy: 09. 09. 2016, 14:43:24 »
Teda pánové, před pár dny jsem zahlídl tohle nové vlákno, ve kterém si tazatel postěžoval na vlastní neznalost bitových operací a přitom se nazval programátorem ;D. Hned mu na to odpověděli, jak se to dá vyřešit jednoduše v hlavě (a to se to dá řešit i jinak než klasickým x * 2 ** y), tak jsem si řekl, no jo, další patlal, co si myslí, že když umí pár věcí v nějakém vyšším programovacím jazyce, že je programátor, takových jsem už zažil hromady. Buď se poučí, má na to být programátorem a vyjde si na start cesty programátora a za 10 let se ohlídne a poděkuje za životní lekci v době, kdy byl tak naivní, že si říkal programátor nebo to vzdá, protože si uvědomí, že na to nemá. C'est la vie!

Že se z toho, ale stane taková dlouhá diskuze a najde se taková hromada patlalů, schopných obhajovat vlastní blbost a neznalost jako výhodu, to bych nečekal, obzvlášť, když si ještě ve své hlouposti dokáží otevírat chlebárny na ty, co to umí a chápou proč tyhle operátory i vyšší programovací jazyky mají, protože vědí, že základy bitových operací a booleovy algebry jsou pro programátora absolutní nutností a přes to nejede vlak ať programuje v jakémkoli jazyce, stejně jako třeba převody z dvojkové soustavy do osmičkové, desítkové, šestnáctkové a zpět z hlavy. Protože s booleovou algebrou či bitovými/binárními operacemi se totiž každý programátor potýká vlastně u každé podmínky, bez ohledu o jaký programovací jazyk jde. Na (momentálním) konci vlákna dokonce znalí ukazují, že i ve vyšších programovacích jazycích jsou bitové posuny daleko rychlejší než jejich náhrada např. násobením či mocninami. Důvody zazněly v diskuzi víckrát, je zbyčné je opakovat.

A pro ty co to pořád nechápou a myslí si, že jejich neznalost je v pořádku mám principiálně stejný příklad:

Operace násobení se taky dá nahradit sčítáním ve smyčce, to ale to neznamená, že násobení nemusím znát a že bych měl násobit takovým kravským způsobem. To samé se dá říct o dělení (odečítání) a dalších matematických či jiných operacích. Doučte se a raději nedávejte na odiv svou blbost, podivuhodná sice je, ale ne tak, jak si vy myslíte 8)
« Poslední změna: 09. 09. 2016, 14:46:03 od ByCzech »

tisnik

Re:Bitové operace ve vyšších jazycích
« Odpověď #327 kdy: 09. 09. 2016, 14:47:58 »
kokoti uz tady nespamujte. delejte neco uzitecnyho. co kdyby jsme zalozili vlastni forum, ktere by bylo na urovni?
Ne, fórum se nezakládá, ale musí se naprogramovat. Vše co bylo v minulosti uděláno je špatně a bylo by dobré si to udělat po svém a dokonale. Kdo do toho jde? :D By mě zajímalo, na čem by to ztroskotalo, ale předpokládám, že už na výběru jazyka :D

Samozrejme je potreba vybrat predevsim jazyk "novy" a "moderni", tedy BEZ bitovych operaci a podobnych veci z doby kamenne :)

gamer

Re:Bitové operace ve vyšších jazycích
« Odpověď #328 kdy: 09. 09. 2016, 14:50:34 »
Pokud chceš posouvat, použiješ posun. Pokud chceš spočítat mocninu 2, můžeš použít umocňování i posun. Posun je asi rychlejší, umocňování je explicitnější a pro přepis matematického vzorce IMHO vhodnější.

Posun je výpočet mocniny dvou. Ale NEMŮŽEŠ je libovolně zaměňovat, protože ty operátory dělají úplně jinou matematickou operaci. Jeden z těch operátorů je definovaný jen na integerech a druhý na floatech (i integerech). Občas ty operátory dávají stejné výsledky, ale vypočítají se úplně jinou metodou. Že je v pythonu nějaká optimalizace pro 2**N kde N je integer je irelevantní. Jsou to jiné operátory s jinou funkcí a chovají se i navenek jinak.

Kit

Re:Bitové operace ve vyšších jazycích
« Odpověď #329 kdy: 09. 09. 2016, 14:58:30 »
kokoti uz tady nespamujte. delejte neco uzitecnyho. co kdyby jsme zalozili vlastni forum, ktere by bylo na urovni?
Ne, fórum se nezakládá, ale musí se naprogramovat. Vše co bylo v minulosti uděláno je špatně a bylo by dobré si to udělat po svém a dokonale. Kdo do toho jde? :D By mě zajímalo, na čem by to ztroskotalo, ale předpokládám, že už na výběru jazyka :D

Samozrejme je potreba vybrat predevsim jazyk "novy" a "moderni", tedy BEZ bitovych operaci a podobnych veci z doby kamenne :)

Obávám se, že většina nových a moderních jazyků bitové operace má bitové operace implementovány. Nemá smysl je diskvalifikovat kvůli této podmínce.