Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: 3 * int -> 16-bittinen int (short)

Burton [03.08.2008 00:27:17]

#

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?

Grez [03.08.2008 01:03:25]

#

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ä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta