C++, bitti asiaa

Mikä on nopeintapa laskea monta bittiä on päällä?
1000100010001 = 4


Sittein toinen kysymys, ANDilla näkee helposti mitkä bitit molemmissa on päällä. Mutta mitenkäs sitten jos bittejä onkin vaikkapa 50?
5544
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat
  • Kiitoksia tuolla toimii tuo bittien laskeminen nopsaan.

    Mutta entäs se toinen kysymys?
    Mitenkäs ootte toteuttanut jos bittejä tarttetaan enemmän kuin 32?

    Pitääkös vain pätkästä nuo bittijonot 32 pituses ja sit jotenkin yhdistellä niitä?

    Ehkä tuo oli hitusen sekavasti selostettu joten minimaalinen esimerkki. Toimii noin, mutta kun bittejä onkin 50-100 niin ongelma suuri.

    Binäärilukuina: 1101 & 0110
    x = 13 & 6

    Äänestä

  • Jokiae kirjoitti:

    Kiitoksia tuolla toimii tuo bittien laskeminen nopsaan.

    Mutta entäs se toinen kysymys?
    Mitenkäs ootte toteuttanut jos bittejä tarttetaan enemmän kuin 32?

    Pitääkös vain pätkästä nuo bittijonot 32 pituses ja sit jotenkin yhdistellä niitä?

    Ehkä tuo oli hitusen sekavasti selostettu joten minimaalinen esimerkki. Toimii noin, mutta kun bittejä onkin 50-100 niin ongelma suuri.

    Binäärilukuina: 1101 & 0110
    x = 13 & 6

    Ne voi pätkästä ja laskea osittain. Luokilla ja operaattoreiden ylilatauksella saat minkä pituisen bittivektorit tahansa käyttäytymään kuin tavalliset 32-bittiset sanat. Näin koodia voi helposti muokata myös 64-bittisille koneille ja muutenkin piilotta mahdollisesti muuttuvat käytännön detaljit.

    Käsittääkseni tämä on jo tehty C :n standardikirjastossa. Toimiiko tällainen sinun kääntäjälläsi?

    bitset bs;
    bitset bs2;
    // sitten tuttuja operaatiota &, |, >>, jne.

    Tuo ensimmäinen voi käytännössä olla tuon toisen kokoinen. Täällä on referenssiä, jos kääntäjän mukana ei tullut:

    http://www.cppreference.com/cppbitset/index.html

    ~

    Äänestä

  • Ja piilotta detaljit kirjoitti:

    Ne voi pätkästä ja laskea osittain. Luokilla ja operaattoreiden ylilatauksella saat minkä pituisen bittivektorit tahansa käyttäytymään kuin tavalliset 32-bittiset sanat. Näin koodia voi helposti muokata myös 64-bittisille koneille ja muutenkin piilotta mahdollisesti muuttuvat käytännön detaljit.

    Käsittääkseni tämä on jo tehty C :n standardikirjastossa. Toimiiko tällainen sinun kääntäjälläsi?

    bitset bs;
    bitset bs2;
    // sitten tuttuja operaatiota &, |, >>, jne.

    Tuo ensimmäinen voi käytännössä olla tuon toisen kokoinen. Täällä on referenssiä, jos kääntäjän mukana ei tullut:

    http://www.cppreference.com/cppbitset/index.html

    ~

    Pikavilkasul tuo näyttää ihan toimivalt joskin hitaalta, tutkitaampas illemmalla tarkemmin.

    Mitenkäs tuo nopeus verrattuna normaaliin bittienkans leikkimiseen?

    Äänestä

  • Jokiae kirjoitti:

    Pikavilkasul tuo näyttää ihan toimivalt joskin hitaalta, tutkitaampas illemmalla tarkemmin.

    Mitenkäs tuo nopeus verrattuna normaaliin bittienkans leikkimiseen?

    No, täytyy myöntää, että en ole testannut koodin nopeutta tai edes katsonut kääntäjän tuottamaa koodia. Ei ole sen vertaa ollut tarvetta nopeille bittioperaatioille omissa pikkujutuissa.

    Periaatteessa nuo template-viritykset ym. voivat tuottaa erittäin nopeaa ja pientä koodia, mutta käytännössä ei aina ihanteeseen päästä :-)

    Ainakin tosin GCC:n bitset.h-tiedostossa sanotaan, että se valitsee prosessorin sopivan sanakoon (word size), jos se riittää vektorin esitykseen. Sen käpistely pitäisi sitten olla yhtä nopeaa kuin tavallisen unsigned longin. Jälleen JOS templatet saadaan kuriin, mikä ei ole varmaa.

    Kuitenkin, ajoin takaa sitä, että jos sanot:

    typedef bitset munBittiVektori;

    Ja käytät kaikkia &, |,

    Äänestä

Kommentoi aloitusta


Jokiae kirjoitti:

Mikä on nopeintapa laskea monta bittiä on päällä?
1000100010001 = 4


Sittein toinen kysymys, ANDilla näkee helposti mitkä bitit molemmissa on päällä. Mutta mitenkäs sitten jos bittejä onkin vaikkapa 50?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu