Operace s bity – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Operace s bity – C / C++ – Fórum – Programujte.comOperace s bity – C / C++ – Fórum – Programujte.com

 

12. 3. 2006   #1
-
0
-

mam v promenne unsigned char ulozenou hodnotu slozek R,G,B,A pixelu.

Jak se s tim da manipulovat. Treba kdybych hodnotu A chtel zmenit z 1 na 0.5 ??

Nahlásit jako SPAM
IP: ...–
Jura_0
Stálý člen
13. 3. 2006   #2
-
0
-

ppavel napsal:

mám v proměné unsigned char uloženou hodnotu složek R,G,B,A pixelu.

Jak se s tím dá manipulovat. Třeba kdybych hodnotu A chtěl změnit z 1 na 0.5 ??


Mozna, kdybys sem soupnul aspon naznak toho kolik, ktera polozka zabira bitu, tak by se nam vsem s tim pracovalo mnohem lepe. Navic do bitu neuloyis desetinne cislo. Mno, ale abych porad nekecal kraviny, tak budu trochu dedukovat. Mas v podstate 8 bitovou paletu(coz je trochu netradicni pro uchovavani RGBA, ale budiz..). Cili jednoduchym vypoctem zjistim, ze by pro kazdou polozku mely byt vyhrazeny 2 bity(to nam nedovoluje moc velky rozsah - jenom 2^2, cili mezi jednotlivymi barvami budou velke skoky).A jeste poznamka, bezne se pouzivaji hodnoty z intervalu <0, 255> a mam k dispozici pouze <0, 3>. A ja se toho rozsahu, teda v tomhle pripade nebudu urputne drzet, i kdyz by na prepocet stacila obycejna trojclenka. Takze ted uz vim, ze hodnota 3 je uplne pruhledny objekt, kdezto 0 nepruhledny. Mno, a na zacatku jsem psal, ze nejdou ulozit do bitu desetina cisla.A ted nastava chvile pro trojclenku:
Predpokladam, ze 1 je naprosto pruhledny 0 je nepruhledny.
A ted teda spoctu tu polovicni pruhlednost.
1...3 (vim, ze 1 je pruhledny - tomu odpovida moje 3)
0.5...x (chcu polovicni, ale nevim kolik to je)
---------
x = (0.5/1)*3 = 1.5 ~2
A vyslo mi 1.5, coz jsou priblizne 2.
Tak a ted to hodime do cecka:


#define _8bTo2b(x) (unsigned)ceil(((x)/1)*3)
#define _setAlpha(RGBA, x) { (RGBA) &= ~3; RGBA |= _8bTo2b(x);}

A ted vysvetleni:


(RGBA) &= ~3;

Znamena, ze vymaskuju(obycejny bitovy soucin) hodnotu RGBA hodnotou ~3(negace 3 -> binarne jsou 3: takhle 0000 0011 a po negaci 1111 1100). Mno, tim vynuluju posledni dva bity.
A ted je nastavime pomoci:


RGBA |= _8bTo2b(x);

_8bTo2b(x) provede nasi trojclenku(nepodstatne).
A nastaveni se provadi bitovy souctem. Tzn, pokud bude hodnota na polovine 0.5, tak mi vyjdou 2(binarne 0000 0010).
A nastaveni probiha asi nejak takhle(bitu oznacenym x si nevsimame)


xxxx xx00
OR 0000 0010
---------
xxxx xx10

Mno, doufam ze jsem to nevsvetlil prilis slozite. Ale pokud ano, tak si z toho vem, akorat to podstatne - ty dva makra.
S tim, ze budes pro zcela pruhledny objekt pouzivat 1 a pak uz to zalezi na tobe, jake desetinne cisla zvolis.(I kdyz v podstate mas jenom omezeny rozsah).



Nahlásit jako SPAM
IP: ...–
13. 3. 2006   #3
-
0
-

Jura_ napsal:
Mas v podstate 8 bitovou paletu(coz je trochu netradicni pro uchovavani RGBA, ale budiz ...


to moc nech?pu, je to norm?ln? 32bitov? tga tedy 8bit na ka?dou slo?ku.

Ka?dop?dn? budu muset k t? odpov?di nastudovat je?t? n?jakou teorii, jeliko? operace s bity m? naprosto unikaj? :) nev?? o n?jakym zdroji na webu?
D

Nahlásit jako SPAM
IP: ...–
Jura_0
Stálý člen
13. 3. 2006   #4
-
0
-

ppavel napsal:

Jura_ napsal:
Mas v podstate 8 bitovou paletu(coz je trochu netradicni pro uchovavani RGBA, ale budiz ...


to moc nech?pu, je to norm?ln? 32bitov? tga tedy 8bit na ka?dou slo?ku.

Ka?dop?dn? budu muset k t? odpov?di nastudovat je?t? n?jakou teorii, jeliko? operace s bity m? naprosto unikaj? :) nev?? o n?jakym zdroji na webu?
D


Mno, mne to bylo hned divne, protoye v tvem prvnim prispevku jsi psal, ze mas v unsigned char(tedy sizeof(unsigned char) = 8 ) ulozene slozky RGBA. Mno, tak ja o zadnem zdroji na webu, kde by zrovna tohle bylo vysvetleno, nevim. Ale postaci ti, kdyz se naucis obycejne bitove operace a jejich syntaxi v C. Klidne se ti to muzu pokusit vysvetli, ale to zalezi na tobe.

Nahlásit jako SPAM
IP: ...–
13. 3. 2006   #5
-
0
-

Jura_ napsal:

ppavel napsal:

Jura_ napsal:
Mas v podstate 8 bitovou paletu(coz je trochu netradicni pro uchovavani RGBA, ale budiz ...


to moc nechápu, je to normální 32bitové tga tedy 8bit na každou složku.

Každopádně budu muset k té odpovědi nastudovat ještě nějakou teorii, jelikož operace s bity mě naprosto unikají :) nevíš o nějakým zdroji na webu?
D


Mno, mne to bylo hned divne, protoye v tvem prvnim prispevku jsi psal, ze mas v unsigned char(tedy sizeof(unsigned char) = 8 ) ulozene slozky RGBA. Mno, tak ja o zadnem zdroji na webu, kde by zrovna tohle bylo vysvetleno, nevim. Ale postaci ti, kdyz se naucis obycejne bitove operace a jejich syntaxi v C. Klidne se ti to muzu pokusit vysvetli, ale to zalezi na tobe.



voni tam sou uložený za sebou :) Já si to někde najdu, díky.

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 114 hostů

Podobná vlákna

Bity — založil Martin

Příznakové bity — založil yaqwsx

Nejvyšší bity v poli — založil Pajda

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý