Tervehdys kaikille,
Elikkäs pitäisi saada muutettuu Uint32 tyyppisen muuttujan väriarvot hex desimaaleiksi.
Eli jos Uint32 sisältää sinisen värin niin Uint32 -> int(0x0000ff)
...vai onko se sillon hex desimaalina kun tieto siirretään suoraa Uint32 int:hen?
-Kiitos.
Heksadesimaali on luvun 16-kantainen esitysmuoto, jossa arvot 0-9 saavat merkit 0-9 ja arvot 10-15 merkit a-f (tai A-F)
Ehkä voisit hieman paremmin selittää, mitä yrität tehdä.
Elikkäs olen tekemässä sellaista ns. "ilotulitus" effektiä ja minulla on väri arvot syötettynä hexdesimaaleina.
Effektissäni luen näytön pinnalta getPixel funktiollani värin koordinaateista. Tämän jälkeen funktio palauttaa koordinaatistossa olevan väri arvon Uint32 tyyppisenä ja tämä tieto pitäisi saada muutettuu takaisin hexdesimaali muotoon.
Edit1:
Sekin kelpaa jos Uint32 sais muutettua RGB muotoon. Eli esim SDL_Color muotoon.
Oiskoha tästä jotain
#include <stdio.h> int main() { unsigned int luku = 0x123456; unsigned char r,g,b; r = (luku >> 16) & 255; g = (luku >> 8) & 255; b = luku & 255; printf("heksana koko juttu: 0x%6x\n", luku); printf("desimaalina koko juttu: %d\n", luku); printf("heksana eriksee: 0x%2x 0x%2x 0x%2x\n", r, g, b); printf("desimaalina eriksee: %d %d %d\n", r, g, b); return 0; }
Edit: Spongi näköjään ehtikin ensin.
En kyllä vieläkään ymmärrä miksi se uint32 pitää muuttaa heksadesimaaliksi. Sehän on kuitenkin lähinnä ihmiskäyttöön tarkoitettu muoto..
Mutta siis, esimerkissäsi uint32 0x000000ff oli sininen, eli ilmeisesti B on vähiten merkitsevä tavu.
RGB-muotoon (x on siis se uint):
r = (x>>16) & 0xff; g = (x>>8) & 0xff; b = x & 0xff;
hex-muotoon saa esim. seuraavasti:
printf("%X", x);
Aivan, tuo "& 0xff" oli jäänyt poijes perästä. Mitä muuten tuo & tuossa meinaa? Lisääkö se Uint32 otettuihin bitteihin 0xff, vai mikä idea tuossa & 0xff on tuossa?
& on monessa kielessä binary and -operaattori: http://en.wikipedia.org/wiki/Binary_and
Tuossa tapauksessa sen avulla suodatetaan pois (muutetaan nolliksi) muut kuin alimmat 8 bittiä, jotka jätetään ennalleen. Heksana siis poistetaan muut kuin kaksi vikaa merkkiä.
Jos tykkää bittien pyörittelystä ja haluaa toteuttaa ASCII heksadesimaalimuunnoksen itse, niin alla on esimerkkinä joskus jonnekin postituslistalle kirjoittamani assembler esimerkkiohjelma, mikä muuntaa yhden tavun. Kääntynee ainakin jollain TASM yhteensopivalla assemblerilla.
; ; Simppeli testiohjelma DOSsille, mikä kirjoitttaa ruudulle ; luvun 123 heksamuotoisena (=0x7B) ; .model small .stack 1024 .data luku db 123 etuliite db '0x' heksaluku dw ? db "$" .code main: mov, ax, _DATA mov ds, ax muunna: mov al, [luku] aam 16 @digit2: add al, 090h daa adc al, 040h daa @digit1: xchg al, ah add al, 090h daa adc al, 040h daa @talteen: mov [heksaluku], ax ruudulle: mov dx, offset etuliite mov ah, 09h int 21h exit: mov ax,4c00h int 21h end main
Jalski, ihmettelempä vain, että miten tuo sinun postisi kuuluu asiaan? :O
Ensinnäkin en ole koodaamass assemblyllä vaan C/C++ toiseksi, en halua muuttaa ASCII:ta hexksoiksi?
...kiitos kuitenkin kaikille avusta. :)
Tuo laittamani esimerkki ei siis muuta ASCII:ta heksaluvuksi, vaan muistissa olevan tavun ASCII heksadesimaaliksi ja kirjoittaa sen näytölle. Suurin osa C-kääntäjistä sallii inline assemblyn käyttämisen ja C-kutsuttavien funktioiden kirjoittaminen assemblyllä ei ikävä kyllä vieläkään ole mikään turha taito hallita.
Noh tämä menee kyllä nytten ihan väittelyksi, mutta minkäs teet.
Olet oikeassa, että ei ole turha taito hallita, mutta assembly on vain sellainen kieli jota kannattaa vain käyttää sillon kun sitä oikeasti tarvitaan. Syy voi tietenkin olla mikä vain, mutta lähinnä lähitsin käyttämään assemblyä, jos tarvitsen oikeasti nopeutta ohjelmaltani tai pientä kokoa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.