[ Predrag Damnjanovic @ 08.04.2002. 11:01 ] @
Nailazio sam na funkcije koje uzimaju za parametar nesto ovako: fja(MIS|MACKA|PAS);
OK, jasno mi je da su oni pojmovi obicni brojevi (definisani sa #define), i jasno mi je da je parametat funkcije tipa unsigned int.
Jedino mi nije jasno kako funkcija sazna da si mu prosledio PSA, MACKU i MISA?
Probao sam da procitam taj unsigned int, ali dobijam neki bezveze broj, niti je sabirak, niti je aritmeticka sredina.
U mom siromasnom borlandovom helpu sam nasao da | operator uporedjuje dva bita, i ako je neki od ta dva makar jedan TRUE, vraca TRUE.
To bas i nema nekog smisla sa onim sto trazim, ali ajde da ne kazete da nisam trazio u helpu...
Trazio sam i u onom FAQu, ali nema nista o ovome.
[ Ivan Dimkovic @ 08.04.2002. 11:41 ] @
| ti je bitwise inclusive OR operator.

Tj. predstavlja logicko ILI - malo matematicke logike ne bi bilo na odmet, a? :)

U svakom slucaju, logicko ILI se moze primeniti i na binarnim brojevima - i rezultat je takodje binarni broj.

Ako su mis, macka i pas - jednobitni brojevi (0 ili 1) funkcija ce dobiti '1' kao parametar ako je bilo koji od ovih brojeva jednak 1.

Uzmi papir i olovku i napisi binarne brojeve, a onda izvrsi logicko ILI nad svakom od binarnih cifri:

Recimo 16 or 8 = 24
16 or 0 = 16

itd..

[ Predrag Damnjanovic @ 08.04.2002. 12:08 ] @
Znaci ipak je inclusive operator, kao sto sam procitao u helpu...
Hmmm, pa kako onda f-ja sa pet takvih mogucih parametra zna koje si mu tacno parametre prosledio?
[ Ivan Tanasic @ 08.04.2002. 12:33 ] @
Aghm, kolko ja znam MIS | MACKA | PAS je logicki izraz tj ima vrednost TRUE ili FALSE. Samim tim bi ova funkcija morala da prima jedan argument tipa boolean.

Ovaj izraz bi bio true recimo ako je mis true a macka i pas false, a ceo izraz bi bio false ako je recimo mis i macka true a pas false. Nemozes biti i mis i macka istovremeno ;)).

Nadam se da mislimo na istu stvar L;)
[ Predrag Damnjanovic @ 08.04.2002. 12:48 ] @
Ukapirao sam
Ako MIS bude 100, a macka 010, a pas 001, onda mogu da vidim koji je bit 1
[ leka @ 08.04.2002. 16:51 ] @
Ovo me podsetilo na ona lupetanja (zastita, nema ovo veze sa tobom) na "3D programiranje" gde je neki "programer" rekao da za programiranje matematika NIJE potrebna... Evo jos jednog dokaza da je matematika KRUCIJALNA za programiranje!

Banalan primer je funkcija (bool bArg), koja bez problema moze da se pozove sa funkcija(JEDAN | DVA | TRI & CETIRI) ...

Voleo bih da na ovo neki sa "3D programiranje" obrate paznju jer bez ovakvih stvari nema cak ni 3D programiranja a ni programiranja baza!
[ Milan Aksic @ 08.04.2002. 19:04 ] @
Uhe bre kakvi su ovo komplikovani integrali, smrz'o sam se!!
I ja smatram da za programiranje nije potrebna HARDCORE matematika. Ako uzmemo u obzir iVar1 + iVar2; onda naravno da ima matematike, ali sam i dalje pri misljenju da nije potrebno PREVISE matematike, kako se to propagira po zasterilim metoda na ETF-u recimo (samo primer ima ih jos).
Nemam namere da pocinjem opet raspravu oko toga, o tome se vec raspravljalo, zato Leko, bez uvrede :) pogledaj starije postove, mislim da je tema bila u 'Vodic za ucenje'.

Sto se Pecinog problema tice, decimalni broj se u binarni pretvara na sledeci nacin:
Na primer broj 57 treba prevesti u binarni broj, onda se decimalni broj deli sa 2 jer je osnova binarnog broja 2, odnosno ima samo dve moguce vrednosti 1 ili 0.

57 : 2 ostatat je 1
28 : 2 ---------> 0
14 : 2 ---------> 0
7 : 2 ----------> 1
3 : 2 ----------> 1
1 : 2 ----------> 1 dobijeni 'binarni broj se cita odpozadi.
Znaci prevedeni decimalni broj 57, u binarni broj je 111001.

Binarni broj se prevodi u decimalni na sledeci nacin:
Na primer broj 10011 treba prevesti, onda koliko cifara ima toliko ima i stepena, od nule se polazi, (ovo je moglo i drugacije da se kaze :)) i onda se sa svakom cifrom u binarnom broj mnozi broj 2 na stepen na koji je cifra, dobijeni broj se sabira sa sledecim brojem sa istim postupokom, gde je stepen manji za jedan, znaci:

10011 = 1 * 2^4 + 0 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0 = 16 + 0 + 0 + 2 + 1 = 19

Nema potrebe da idem daljem sa ostalim operacijam.

Postoje 4 bitno orijentisana operatora u C/C++.
AND &
daje tacan iskaz samo kada su oba operanda (ili bita tacni)

OR |
daje tacan iskaz samo kada je jedan, ili oba operanda tacna.

exkluzivno OR ^
daje tacan iskaz samo kada su operandi razlicit.

komplement ~
Suprotna vrednost. Postavice bit, ako bit nije bio postavljen i obrnuto

(E sada ako treba i tablice da pisem onda... cete se nacekati :)

Evo primera i za one koji na forumu traze FAQ umesto da nabave knjigu (da Peco na tebe mislim :))
Bitovi se postavljaju operacijom maskiranja. Na primer ako postoji cetvorobajtni flag i treba postaviti osmi bit na TRUE, onda treba izvrsiti OR sa vrednoscu 128, zato jer je 128 u binarnom sistemu 1000 0000.

1 = 1
2 = 2
3 = 4
4 = 8
5 = 16
6 = 32
7 = 64
8 = 128
...

Ako u broju 1010 0110 0010 0110 (u decimalnom je 42534), onda sledi situacija:

1010 0110 0010 0110 // binarni broj u kome treba postaviti osmi bit na TRUE
OR
0000 0000 1000 0000 // 128, dodate su nule ispred
=
1010 0110 1010 0110

Ponistavanje osmog bita se izvodi operatorom AND i komplementom od 128. Komplement od 128 (^128) postavlja sve njegove pojedinacne bitove na suprotne vrednosti, zato ako je 128 bio 1000 0000 komplement je 0111 1111.Kapiras Peco :) i onda imamo sledecu situacija:

1010 0110 1010 0110
AND
1111 1111 0111 1111
=
1010 0110 0010 0110

I zadnje je ako treba promeniti bit u suprotnu vrednost, bez obzira koja je njegova vednost, koristi se operator exkluzivni OR. Mrzi me jos da pisem, verovatno ste vec shvatili ali da ipak zavrsim do kraja. Znaci ako treba promeniti OPET osmi bit bla, bla bla... onda koristimo ^ sa (opet) 128, onda imamo sledecu situaciju:

1010 0110 1010 0110
^
0000 0000 1000 0000
=
1010 0110 0010 0110

Peco imas srece sto sam imao vremena da sve ovo pisem :) ali jos jednom po ko zna koji put, uzmi neku knigu, ako imas namere da radis nesto u C/C++.

Pozdrav.
[ Predrag Damnjanovic @ 08.04.2002. 21:45 ] @
Moram nesto da te pitam na kraju svega ovoga
Zar nema gotove funkcije koje decimalni zapis pretvaraju u binarni, i obrnuto ?!?
[ Milan Aksic @ 08.04.2002. 22:07 ] @
E potrazi mora da ima, namuci se malo :)

Ako hoces da vidis kako bi to radilo u programu, mogu da ti posaljem jedan mali program, koji sam odavno napisao, cisto ako te zanima ;)
[ leka @ 08.04.2002. 22:27 ] @
Citat:
zastita:
Moram nesto da te pitam na kraju svega ovoga :)
Zar nema gotove funkcije koje decimalni zapis pretvaraju u binarni, i obrnuto ?!?


Odgovor je NE ako mislis nesto tipa
Code:
 int iTrt = 1010011b;

[ Predrag Damnjanovic @ 08.04.2002. 23:12 ] @
Mislio sam na funkciju, tipa
int i = BinToDec(1011);
Verovatno ima, samo treba da se protalaska, mada ce mi biti zadovoljstvo da je napisem ako ne postoji
[ Milan Aksic @ 08.04.2002. 23:22 ] @
Gde bre Leko nadje ono 'b' na kraju binarnog broja :)
Peco evo ti funkcija, Copy/Paste i sacuvaj funkciju.

Code:

#include <stdio.h>

unsigned long IntToBin(int vrednost);

void main(void)
{
   int loop = 1, cont, vrednost;
   while (loop)
   {
        vrednost = 0;
       printf("\nUnesi vrednost koju zelis da konvertujes u binarni broj: ");
        scanf("%d", &vrednost);
       printf("broj: %ld", IntToBin(vrednost));
      printf("\n\nNaredno racunanje (0)Exit, (1)Continue: ");
      scanf("%d", &cont);
      loop = cont;
   }
}

unsigned long IntToBin(int vrednost)
{
    unsigned long bin = 0, mn = 1;
    while (vrednost > 0)
       {
        bin += (vrednost % 2) * mn;
        vrednost /= 2;
        mn *= 10; // ovde se kroz svaki prolazak dodaje po jedna nula
    }
    return bin;
}


Ova verzija programa dobijeni binarni broj cuva u promenljivoj unsigned long, uradio sam i verziju gde se binarni broj cuva u stringu, razlika je ta sto, taj prog koji radi sa stringom moze da cuva mnogo veci binarni broj, mada mora se priznati da ces retko kada imati potrebu da cuvas binarni broj koji ne moze da stane u unsigned long (0 - 4,294,967,295) mada ako bude trebalo reci.
izmena: izbrisan komentar

[Ovu poruku je menjao passanger dana 10.04.2002 u 05:55 AM GMT]
[ Milan Aksic @ 09.04.2002. 19:37 ] @
Evo ti sors, za koji si me zamolio preko ICQ-a, valjda ce ti ovo zavrsiti posao, javi da li je.
Code:

#include <iostream.h>

void Int_To_Bin(int);

int main()
{
    int dec;
    while (1)
    {
        cout << "Unesi decimalnu vrednost (-1)Exit: ";
        cin >> dec;

        if (dec == -1)
            break;

        cout << "Unesena decimalna vrednost je: " << dec << endl;
    
        Int_To_Bin(dec);
    }

    return 0;
}

void Int_To_Bin(int dec)
{
    int j = 0;
    int bin[50];

    while (dec > 0)
    {
        bin[j] = dec % 2;
        dec /= 2;
        j++;
    }

    j--;

    cout << "Dobijena binarna vrednost je: ";
    for ( ;j >= 0; j--)
        cout << bin[j];

    cout << endl;
}

izmena: izbrisan komentar

[Ovu poruku je menjao passanger dana 10.04.2002 u 05:54 AM GMT]
[ Dejan Lozanovic @ 09.04.2002. 20:24 ] @
Citat:
zastita:
Moram nesto da te pitam na kraju svega ovoga
Zar nema gotove funkcije koje decimalni zapis pretvaraju u binarni, i obrnuto ?!?

A jel moze jedno pitanjce ? Jesi li mislio na dekadni ili bas na decimalni zapis ? Jer ako si mislio na bas decimalni, onda tu se u praksi koriste razna kodiranja da bi se decimalni zapis nekog broja pogodno predstavio jer imas probleme da neke broje koji su u dekadnom obliku napisani npr 0.4 ne mogu da se predstave sa konacno mnogo cifara u binarnom obliku ( ca detalje oko raznih nacina kodirananja savetujem ti da uzmes knjigu Osnovi Racunarskih Sistema - Mitic; knjiga se skoro pojavila u prodaji i imas da ju kupis na matematickom fakultetuu beogradu)


A ako si mislio na dekadni onda je stvar tu jako laka , da ti odam jedan trik onako cisto da pokzaemo da matematike ipak niej na odmet iako nema integrala ne znaci da nije HARDCORE
iz dekadnog u heksadecimalni to znas kako jako slatko ide ) zar ne to mozes uvek u C bez muke e sada iz heksadecimalnog u binarni je slatko ) posto je 2^4=16, odatle ipak moze nesto slatko da se izvuce ) jer pretvar cifru po cifru recimo broj 0x13=0001 0101
[ Dejan Lozanovic @ 09.04.2002. 20:33 ] @
Citat:
passanger:
void Int_To_Bin(int dec)
{
int j = 0;
int bin[50];

while (dec > 0)
{
bin[j] = dec % 2;
dec /= 2;
j++;
}
}


Ne bih da se nesto duvam, tipa ko je bolji programer, s obzirom da smo skoro svi bili isprozivani od blue-a ) ovo je mnogo bolje da se uradilo preko bitskih operatora. Jer aritemticki operatori relativno skupi, pogotovo deljenje i deljenje po modulu . A opet bitski su najbrzi
recimo dec %2 kao rezultat ze dati poslednji bit, jer svaki paran broj binarno zapisan zadnju cifru ima 0 a neparni 1. e pa umesto deljenja po ostatku bolje je bilo iskoristiti dec & 1;
A ovo dec /=2 je nista drugo nego siftovanje udesno, sto je opet jako brzo



[Ovu poruku je menjao Gojko Vujovic dana 09.04.2002 u 10:28 PM GMT]
[ Predrag Damnjanovic @ 09.04.2002. 22:17 ] @
Mislio sam na celobrojnu vrednost, ma kako je zvao
[ Dragi Tata @ 09.04.2002. 22:37 ] @
Citat:
SyStemOuT:

Ne bih da se nesto duvam, tipa ko je bolji programer, s obzirom da smo skoro svi bili isprozivani od blue-a :)) ovo je mnogo bolje da se uradilo preko bitskih operatora. Jer aritemticki operatori relativno skupi, pogotovo deljenje i deljenje po modulu ;). A opet bitski su najbrzi
recimo dec %2 kao rezultat ze dati poslednji bit, jer svaki paran broj binarno zapisan zadnju cifru ima 0 a neparni 1. e pa umesto deljenja po ostatku bolje je bilo iskoristiti dec & 1;
A ovo dec /=2 je nista drugo nego siftovanje udesno, sto je opet jako brzo ;)


Ti štosevi sa šiftovanjem i bit-operacijama mogu da ubrzaju programe samo ako se koriste stari i "glupi" kompajleri. Moderni kompajleri će automatski to da odrade umesto tebe, a program je mnogo jasniji i čitljiviji.
[ Ivan Dimkovic @ 10.04.2002. 01:58 ] @
Hehe... Dragi Tata mi uze rec iz usta :)))

phfm...
[ Milan Aksic @ 10.04.2002. 06:41 ] @
Citat:
SyStemOuT:
Citat:
passanger:
void Int_To_Bin(int dec)
{
int j = 0;
int bin[50];

while (dec > 0)
{
bin[j] = dec % 2;
dec /= 2;
j++;
}
}


Ne bih da se nesto duvam, tipa ko je bolji programer, s obzirom da smo skoro svi bili isprozivani od blue-a :)) ovo je mnogo bolje da se uradilo preko bitskih operatora. Jer aritemticki operatori relativno skupi, pogotovo deljenje i deljenje po modulu ;). A opet bitski su najbrzi
recimo dec %2 kao rezultat ze dati poslednji bit, jer svaki paran broj binarno zapisan zadnju cifru ima 0 a neparni 1. e pa umesto deljenja po ostatku bolje je bilo iskoristiti dec & 1;
A ovo dec /=2 je nista drugo nego siftovanje udesno, sto je opet jako brzo ;)



[Ovu poruku je menjao Gojko Vujovic dana 09.04.2002 u 10:28 PM GMT]

Kao prvo, nisam ono gore pisao da bih pokazao kako sam ja 'veliki programer'... svasta, imao sam vremena da ono gore ispisem a s'obzirom da Pecu i c/c++ FAQ mrzi da procita, pokusao sam da mu pomognem, a mozda ce i jos nekome dobro doci da to procita, kada je vec tu.Isto tako, ne znam kada je blue bilo koga prozivao i u kom kontextu pa se samim tim i ne osecam prozvanim, btw. ako je blue sve isprozivao u kontextu slabe kompetentnosti, onda nema sumnje da je pogresio, tu ne mislim prvenstveno na sebe... mada opet ne znam o cemu se radi.

Drugo, ono gore sam pisao pre mozda godinu/godinu ipo, kako sam i spomeno u mom predjasnjem postu, tako da sam sada samo uradio copy paste. Mada... moj prvi pokusaj tada, da resim ovaj problem, je cuvao cifre u char niz umesto (sada) u int niz, e vec je taj prog pun kojekakvih brljotina i raznog 'hakeraja' kako bi to naterao da to proradi ;) za divno cudo program je radio iako je, priznajem prava brljotina.
Toliko