| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
Keskustelut - C/C++ - Bittioperaatioteditoitu: 17:57 19.11.09 appelsiini011 16:15 19.11.09 Sanotaan, että haluan purkaa RGB arvon 32-bittisestä intistä seuraavaan tyyliin: C++ Uint32 rgb = 0xFA03FF; //Siis muotoa rrggbb: r=0xFA, g=0x03, b=0xFF Uint8 b = rgb & 0xFF; //Nollataan ylimääräiset bitit Uint8 g = (rgb >>= 8) & 0xFF; //Shiftataan jo luettu tavu pois Uint8 r = (rgb >>= 8) & 0xFF; Uint32 ja Uint8 ovat hypoteettisia tyyppejä (Tai oikeastaan määritelty SDL-kirjastossa, jonka kanssa leikin, mutta se ei ole nyt oleellista). Kysymys kuuluukin, onko yllä oleva koodi riippuvainen prosessoriarkkitehtuurista? Wikipediaa selaillessa osui silmään artikkeli, jossa kerrotaan tavujärjestyksen riippuvan prosessoriarkkitehtuurista (little-/big-endian). Nyt alkaa maallikon pää olemaan jo niin sekaisin bittien pyörittelystä, että toivottavasti sain esitettyä asian selvästi. EDIT: Siis ehkä paremmin tiivistettynä: Riippuvatko bittioperaatiot C/C++:ssa prosessoriarkkitehtuurista? Tulkitaanko kokonaisluku hexadesimaalimuodossa kuten 0xFA03FF kaikissa järjestelmissä samalla tavalla, ja tuottavatko bittioperaatiot sillä saman tuloksen järjestelmästä riippumatta? Ja ehkä vielä tärkeämmin: onko koko kysymys täysin tyhmä, ja olenko ymmärtänyt Wikipedian artikkelin tavujärjestyksestä täysin väärin? >: ) editoitu: 18:58 19.11.09 Grez 18:57 19.11.09 Mielestäni prosessoreiden bittijärjestys ei yleensä vaihtele vaan tavujärjestys. Käytännössä sillä ei ole merkitystä C-koodauksen kanssa, paitsi jos on tarkoitus välittää tietoa useamman erityylisen järjestelmän välitse (tiedostot, verkko tms.) C:n sisällä luvut toimivat aina samoin päin riippumatta siitä, miten ne koneen muistissa tallennetaan. Toki jos laita muistiosoitteeseen 32-bittisen luvun ja luet samasta muistiosoitteesta ulos 8-bittisen luvun, niin tällöin huomaat prosessoriarkkitehtuurin erot. LN 01:39 20.11.09 Koodiesimerkissä arkkitehtuurin endianness ei vaikuta tulokseen, jos oletetaan että alkuarvo rgb on annettu koodissa tuolla tavalla. Sen sijaan jos rgb luetaan tiedostosta, vastaanotetaan verkosta, tms, niin silloin mahdollinen tavujärjestyksen muuntaminen on otettava huomioon. |
![]() Haku
|