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?
1000100010001 = 4
Sittein toinen kysymys, ANDilla näkee helposti mitkä bitit molemmissa on päällä. Mutta mitenkäs sitten jos bittejä onkin vaikkapa 50?
Vastaukset 5
Vanhimmat
http://www.tekpool.com/?cat=9
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
~
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 &, |,