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

gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #255 kdy: 08. 09. 2016, 21:56:04 »
Noef píše o dělání webů.

Jenomže ještě nepochopil, že opravdový profesionál bez ohledu na obor má nějakou profesní čest. A ta mu nedovolí odflinknout dílo. Profík si netroufne prodávat stůl s kratší nohou, přesolený žrádlo, jiskřící rozvaděč, lak na autě samou bublinu nebo program, u kterýho neví, jak vlastně funguje.

Vymlouvat se, že to sám umí líp, ale ostatní jsou matláci a jenom se jim přizpůsobuje, a ještě se tím chlubit, zvládne jenom ten "nejlepší z nejlepších".

Je normální používat jen podmnožinu jazyka. Proto existují různé lintery a přepínače use strict. Google také zakazuje používat některé featury, které jsou jinde ok https://google.github.io/styleguide/pyguide.html?showone=Power_Features#Power_Features

Já osobně nevidím důvod k používání bitových posunů jako náhrady za vhodnější matematické operace. Zejména ve vysokoúrovňovém jazyce. Když budu slovy popisovat ten algoritmus, který tu byl odkazován, tak budu říkat 2 na n-tou a ne 1 bitově posunuto o n doleva. Zápis je stejně dlouhý, rychlost nepodstatná. Bitový posun určitě použiji tam, kde zkrátí zápis. Pokud to někdo používá všude, tak mi to nevadí, ale ať se nenaváží do lidí, kteří to nepoužívají.


javaman ((

Re:Bitové operace ve vyšších jazycích
« Odpověď #256 kdy: 08. 09. 2016, 22:03:50 »
Hlavně se to přeloží úplně stejně, takže matlák má smůlu a jeho cool fíčura je cool jen na rootu. Ale když jsem byl malej, taky jsem si říkal, jak krutý vychytávky používám.

gamer

Re:Bitové operace ve vyšších jazycích
« Odpověď #257 kdy: 08. 09. 2016, 22:05:48 »
A tohle Java dělá za mě, takže se můžu soustředit na opravdovou práci. Lopaty budou přemýšlet, jestli použít posun :D

Java to za tebe neudělá, protože ani java compiler nemá křišťálovou kouli.
Kód: [Vybrat]
class javaman
{
    public static void main(String[] args)
    {
        if (pow(62) != shift(62))
        {
            System.out.println("javaman je borec");
        }
        if (pow(63) != shift(63))
        {
            System.out.println("javaman je lopata");
        }
    }

    public static double pow(long exponent)
    {
        return Math.pow(2, exponent);
    }

    public static double shift(long exponent)
    {
        return 1L << exponent;
    }
}
Za domácí úkol se zkus zamyslet, proč jsi lopata.

gl

Re:(
« Odpověď #258 kdy: 08. 09. 2016, 22:07:53 »
A ke zpracování signálů na jednom řádku - mezi zpracování signálů se dá započítat třeba FIR filtr 1. řádu u ADC na potlačení šumu.

Třeba derivační článek xn+1 = 7/8*xn + 1/8*a se napíše v C v přerušení 12b ADC takto:

Kód: [Vybrat]

volatile uint16_t x = 0;

void ADC_ISR(void) {
  x = ((x << 3) - x + ADC_VALUE) >> 3;
}

Třeba u ARMu s barrel shifterem je to velice efektivní metoda. Jenom vědět, jak na to bez násobení a floatů.

Python nedělám, ale pokud by chtěl stejně filtrovat data, tak princip bude pořád stejný. A taky se to asi vejde na jednu lajnu...

v Pythonu na běžném procesoru je IMHO

Kód: [Vybrat]
x = (x*7 + ADC_VALUE)//8

stejně rychlé a je to přesnější přepis toho vzorce. Snáz se to čte.

javaman ((

Re:Bitové operace ve vyšších jazycích
« Odpověď #259 kdy: 08. 09. 2016, 22:11:30 »
A tohle Java dělá za mě, takže se můžu soustředit na opravdovou práci. Lopaty budou přemýšlet, jestli použít posun :D

Java to za tebe neudělá, protože ani java compiler nemá křišťálovou kouli.
Kód: [Vybrat]
class javaman
{
    public static void main(String[] args)
    {
        if (pow(62) != shift(62))
        {
            System.out.println("javaman je borec");
        }
        if (pow(63) != shift(63))
        {
            System.out.println("javaman je lopata");
        }
    }

    public static double pow(long exponent)
    {
        return Math.pow(2, exponent);
    }

    public static double shift(long exponent)
    {
        return 1L << exponent;
    }
}
Za domácí úkol se zkus zamyslet, proč jsi lopata.

A co jsi tím teda chtěl říct?


gamer

Re:Bitové operace ve vyšších jazycích
« Odpověď #260 kdy: 08. 09. 2016, 22:13:27 »
A co jsi tím teda chtěl říct?

Ty nerozumíš ani tak jednoduchému kódu, že? Chceš nějakou nápovědu?

Kit

Re:Bitové operace ve vyšších jazycích
« Odpověď #261 kdy: 08. 09. 2016, 22:26:55 »
A co jsi tím teda chtěl říct?

Ty nerozumíš ani tak jednoduchému kódu, že? Chceš nějakou nápovědu?

Motyce nevysvětlíš, co je to lopata :)

javaman ((

Re:Bitové operace ve vyšších jazycích
« Odpověď #262 kdy: 08. 09. 2016, 22:27:29 »
A co jsi tím teda chtěl říct?

Ty nerozumíš ani tak jednoduchému kódu, že? Chceš nějakou nápovědu?

Ano.

gamer

Re:Bitové operace ve vyšších jazycích
« Odpověď #263 kdy: 08. 09. 2016, 22:43:59 »
A co jsi tím teda chtěl říct?

Ty nerozumíš ani tak jednoduchému kódu, že? Chceš nějakou nápovědu?

Ano.

Můžeš začít tady: http://stackoverflow.com/questions/8373415/difference-between-shl-and-sal-in-80x86
a pak se zkus zamyslet, co taková instrukce udělá se signed číslem, když není rozdíl mezi arithmetic a logical shiftem.

balki

Re:Bitové operace ve vyšších jazycích
« Odpověď #264 kdy: 08. 09. 2016, 22:48:38 »
A co jsi tím teda chtěl říct?

Ty nerozumíš ani tak jednoduchému kódu, že? Chceš nějakou nápovědu?

Ano.

Můžeš začít tady: http://stackoverflow.com/questions/8373415/difference-between-shl-and-sal-in-80x86
a pak se zkus zamyslet, co taková instrukce udělá se signed číslem, když není rozdíl mezi arithmetic a logical shiftem.

Ale hlavne, Math.pow(a,b) vracia double, takze skumat, ci sa jeden long castovany na double nerovna s double pomocou opereratora "!="  je trosku nerozum :) Len tak na margo :)

balki

Re:Bitové operace ve vyšších jazycích
« Odpověď #265 kdy: 08. 09. 2016, 22:50:38 »
Double neporovnavat pomocou ==  a != . To robia vietekto :)

ked uz mam prispiet k dnesnemu flame :)

gl

Re:(
« Odpověď #266 kdy: 08. 09. 2016, 23:00:25 »
A ke zpracování signálů na jednom řádku - mezi zpracování signálů se dá započítat třeba FIR filtr 1. řádu u ADC na potlačení šumu.

Třeba derivační článek xn+1 = 7/8*xn + 1/8*a se napíše v C v přerušení 12b ADC takto:

Kód: [Vybrat]

volatile uint16_t x = 0;

void ADC_ISR(void) {
  x = ((x << 3) - x + ADC_VALUE) >> 3;
}

Třeba u ARMu s barrel shifterem je to velice efektivní metoda. Jenom vědět, jak na to bez násobení a floatů.

Python nedělám, ale pokud by chtěl stejně filtrovat data, tak princip bude pořád stejný. A taky se to asi vejde na jednu lajnu...

v Pythonu na běžném procesoru je IMHO

Kód: [Vybrat]
x = (x*7 + ADC_VALUE)//8

stejně rychlé a je to přesnější přepis toho vzorce. Snáz se to čte.

Ještě bych dodal, že nemá smysl snažit se takovéhle věci implementovat efektivně v pythonu. To nejde. Existuje spousta hotových filtrů implementovaných v C:

http://docs.scipy.org/doc/scipy/reference/signal.html

O zpracování signálů nic nevím, ale předpokládám, že tam najdete co potřebujete.

Případně existují způsoby jak snadno kombinovat C a python:

Kód: [Vybrat]
import numpy as np
import scipy as sp

from scipy.weave import inline

def my_fir(arr):
    assert isinstance(arr, np.ndarray)
    n = len(arr)
    code = """
    int x = 0;
    for(int i = 0; i < n; i++)
    {
    x = ((x << 3) - x + arr[i]) >> 3;
    arr[i] = x;
    }
    """
    inline(code, ['arr', 'n'], compiler='gcc')
    return arr

arr = np.array(range(20))

newarr = my_fir(arr)

print newarr

Případně existují řešení kompilující podmnožinu pythonu:

http://numba.pydata.org/

Asi úplně nejlepší je přejít na Julii. Dohadovat se, jestli je v Pythonu rychlejší bitový posun nebo dělení a násobení je nesmysl. Mnohom většího zrychlení dosáhnete přechodem na jiný jazyk.

gamer

Re:Bitové operace ve vyšších jazycích
« Odpověď #267 kdy: 08. 09. 2016, 23:01:28 »
Ano, to je samozřejmě další důvod, proč nejde zaměňovat pow a shift... Nicméně tady není problém s double ani s přesností:
pow(63): 9.223372036854776E18
shift(63): -9.223372036854776E18

gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #268 kdy: 08. 09. 2016, 23:08:32 »
Ano, to je samozřejmě další důvod, proč nejde zaměňovat pow a shift... Nicméně tady není problém s double ani s přesností:
pow(63): 9.223372036854776E18
shift(63): -9.223372036854776E18

Tak tohle je čistě problém Javy. V Pythonu mají integery nekonečnou přesnost. Při posunu se nic neztrácí.

balki

Re:Bitové operace ve vyšších jazycích
« Odpověď #269 kdy: 08. 09. 2016, 23:25:03 »
Ano, to je samozřejmě další důvod, proč nejde zaměňovat pow a shift... Nicméně tady není problém s double ani s přesností:
pow(63): 9.223372036854776E18
shift(63): -9.223372036854776E18

Zhodou to vyslo a zistil si, ze typy v jave su signed, gratulujem :D