Meneekö se näin:
Bittiä käytetään merkitsemään jotain, kuten soluautomaatin solun tilaa tai logiikan totuustaulukon kohdan arvoa. Bitti vie viimeisen sijan 16, 32 tai 64 bitin kokoisesta muistipaikasta, ja loput 15, 31 tai 63 bittiä jäävät käyttämättä.
Vai käsitelläänkö taulukoita ikään kuin lukuja numero(bitti) kerrallaan? Soluautomaatissa jotenkin näin:
0000000000000000
0000010000000000
0000001000000000
Eli kolmella 16 bitin luvulla kuvattiin kuinka 2 päälläolevaa solua on vinottain toisiinsa nähden.
Vai pitääkö ohjelmoijan huolehtia tällaisista, vai toteuttaako kääntäjä ne tehostukset automaattisesti?
Jos kyse ei ole laskentatehosta sinällään, niin ehkä sitten siitä, että laskettava data saadaan mahtumaan prosessorin cacheen.
Bittiä käytetään merkitsemään jotain, kuten soluautomaatin solun tilaa tai logiikan totuustaulukon kohdan arvoa. Bitti vie viimeisen sijan 16, 32 tai 64 bitin kokoisesta muistipaikasta, ja loput 15, 31 tai 63 bittiä jäävät käyttämättä.
Vai käsitelläänkö taulukoita ikään kuin lukuja numero(bitti) kerrallaan? Soluautomaatissa jotenkin näin:
0000000000000000
0000010000000000
0000001000000000
Eli kolmella 16 bitin luvulla kuvattiin kuinka 2 päälläolevaa solua on vinottain toisiinsa nähden.
Vai pitääkö ohjelmoijan huolehtia tällaisista, vai toteuttaako kääntäjä ne tehostukset automaattisesti?
Jos kyse ei ole laskentatehosta sinällään, niin ehkä sitten siitä, että laskettava data saadaan mahtumaan prosessorin cacheen.
Vastaukset 2
Vanhimmat
tietokone (tai pikemminkin käyttöjärjestelmä/muisti) käsittelee tehokkaiten 2 potensseja, tavu on useimmiten 8 bittiä ja hyvin yleinen tietotyypeissä. Ohjelmoijan ei tarvitse huolehtia muusta kuin järkevästä muistinvarauksesta (jos varaa dynaamisesti), tietysti koodin optimointi on aina hyväksi mutta ei niin kuin tarkoitit (/käsitin). En oikein ymmärtänyt mitä tarkoitit taulukoilla? "tyhjät" bitit eivät jää käyttämättä vaan niitä tarvitaan prosessorin sisäisissä laskutoimituksissa. Esim. 0001 ei ole sama kuin 000000001 vaan kun 0001 lisätään 1111 tapahtuu oveflow, jota ei tapahdu kun 00000001 lisätään 00001111.
Mutta jos tilaa riittää ilmaisemaan muutama hassu bitti ei tietenkään ole järkevää käyttää monen tavun mittaisia tietotyyppejä.
Ei se bitti vie tilaa enempää kuin yhden bitin, eli prosessorin yhteen rekisteriin mahtuu nykyisissä koneissa 32 tai 64 bittiä kerralla. Sopivissa tehtävissä tällaisen pakkauksen nopeusvaikutus on erittäin merkittävä. Jos esimerkiksi monelle bitille tehdään useita operaatioita peräkkäin, se saatetaan pystyä toteuttamaan siten, ettei prosessorin tarvitse tallentaa välituloksia missään vaiheessa muistiin tai edes cacheen. Kun operoitava bittisarja pysyy rekisterissä, suoritus on todella nopeaa.
Melkoinen nopeusvaikutus on usein silläkin, että tietorakenne saadaan pakattua niin pieneen tilaan, että se pysyy cachessa mahdollisimman hyvin (aivan kuten sanoit itsekin).
Tällainen optimointi tosin vaatii tavallisesti sen, että ohjelmoija pakkaa itse bitit mieleisiinsä yksiköihin (käytännössä 8, 16, 32 tai 64 bitin paketteihin). Vaikka kääntäjä tietäisikin, että jonkin tiedon tallentamiseen tarvitaan vain yksi bitti, se tuskin arvaisi mitkä bitit kannattaa pakata samaan pakettiin. Kun prosessori lataa tavaraa rekistereihinsä, se ei kuitenkaan voi tehdä sitä bitti kerrallaan, vaan dataa tulee aina koko paketti kerralla.
Seuraavassa esimerkki, miten C-kielessä tallennetaan kolme bittiä (viides, kahdeksas ja 15. bitti) unsigned int-tyyppiseen muuttujaan. int oli ainakin minun tietokoneessani näköjään 32 bittinen, mutta jossain muualla se voi olla erikokoinen.
#include
int main() {
unsigned int i = 0;
int bit;
printf("tyypin int koko on %i bittia.\n", sizeof(i)*8);
i |= (1