Hei, pikainen kysymys. Minulla on kolme integer-muuttujaa, jotka haluaisin yhdistää yhdeksi 16-bittiseksi shortiksi. Tunnen rgbtouint32-funktion, joka muuttaa integerit 32-bittiseksi uintiksi, mutta 16-bittisen suhteen minulla ei ole harmainta aavistustakaan. Kuinka tämä onnistuu?
Nimestä päätellen rgbtouint32 yhdistää kolme 8-bittistä lukua yhteen 32-bittiseen lukuun. Jos se ottaa parametreiksi 16-bittiset luvut, niin se hävittänee alimmat 8 bittiä syötetiedoista.
Eli oletettavasti rbgtouint32 on jokseenkin seuraava:
uint32 rgbtouint32(int r, int g, int b) { return (r & 0xff) << 16 | (g & 0xff) << 8 | (b & 0xff); }
Pitäisi tietää mitä haluat. Joka tapauksessa pienempään tilaan väkisin laitettaessa on aina tilanteita, joissa alkuperäisiä ei voi palauttaa. Jos sinulle olennaista on ainoastaan, että saat kolme 16-bittistä lukua laitettua yhteen 16-bittiseen muuttujaan (luonnollisella oletuksella, että niitä ei enää saa takaisin) niin yksinkertainen ratkaisu voisi olla esimerkiksi seuraava.
x = a ^ b ^ c
Jos taas haluat pystyä palauttamaan esim. viimeiset 5 bittiä kustakin luvusta niin esimerkiksi seuraavasti:
x = (a & 0x1f) << 10 | (b & 0x1f) << 5 | (c & 0x1f)
Jos taas leikitään, että kyse olisi edelleen rgb-väreistä ja käytettäisiin 16-bittisiä värejä, niin silloin yleensä vihreälle on varattu 6-bittiä, koska ihmissilmä on herkin vihreälle värille. Tällöin se menisi seuraavasti:
x = (r & 0x1f) << 11 | (g & 0x3f) << 5 | (b & 0x1f)
Ja edellinen oletuksella, että parametereina käytetään 8-bit värejä (0-255):
x = (r & 0xf8) << 8 | (g & 0xfc) << 3 | (b & 0xf8) >> 3
Yleisesti ottaen näissä voi nuo r (punainen) ja b (sininen) vaihtaa paikkaa riippuen ympäristöstä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.