|
Programiranje Programski jezici, tehnike, alatke... |
|
Alatke vezane za temu | Vrste prikaza |
5.3.2008, 11:24 | #1 |
Veteran
|
Dobijanje broja koji je stepen od 2
Od skora krenuo ozbiljnije da ucim ogl, pa me je deo za ucitavanje textura naterao da napisem jednu f-ju koja radi sledece: Uzima neki broj i posle vraca najblizi broj koji je stepen od 2. Npr za brojeve od 9 do 15 to ce biti 16, za brojeve od 17 do 31 to ce biti 32 itd... Voleo bih da vidim kako bi neko od vas ovo resio, evo f-je koju sam ja napisao:
Kod:
unsigned int get_power_of_two(unsigned int number) { if ((number&(number-1)) == 0) //Ovo proverava dal je broj vec stepen od 2 { return number; } else { const int len = sizeof(int)*8; bool number_bits[len]; //pravi se array za bitove od kojih se broj sastoji for (int n = 0; n< len; n++) { number_bits[n] = 0; } //Ovaj deo cita uneti broj i u array smesta 1 ako ili 0 tamo gde treba //Vazno je reci da se brojevi postavljaju od nazad zbog lakseg pronalazenja stepena 2 int counter = 0; while (number!=0) { number_bits[len-1-counter] = number%2; number/=2; counter++; } Ovde se trazi u array-u gde je prva jedinica int i; for (i=0; i < len;i++) { if (number_bits[i] == 1) break; } //Na kraju dobijamo broj koji je stepen od 2 return (unsigned int)pow(2, len-i); } } |
5.3.2008, 18:29 | #2 |
Starosedelac
|
Re: Dobijanje broja koji je stepen od 2
Zar 17 nije mnogo blize broju 16, a ne 32?
anwy... Kod:
// basecon.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "math.h" float Calc(int number) { return (float) log(number) / log(2); } int roundToInt(float f) { return (int)((f < 0.0f) ? f - 0.5f : f + 0.5f); } int main(int argc, char* argv[]) { int exp = roundToInt(Calc(122)); printf("%d\n", exp); printf("%f", pow(2, exp)); scanf("%d"); return 0; } nadam se da ces se snaci... |
5.3.2008, 19:40 | #3 |
Starosedelac
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.304
Zahvalnice: 65
Zahvaljeno 438 puta na 328 poruka
|
Re: Dobijanje broja koji je stepen od 2
Ako vraća najbliži stepen dvojke (znači ako je number == 17, vraća 16) onda ide ovako:
Kod:
#include <stdio.h> #include <stdlib.h> #include <math.h> unsigned int get_power_of_two(unsigned int number); int main(int argc, char *argv[]) { unsigned int broj; scanf("%d", &broj); printf("%d\n", get_power_of_two(broj)); system("PAUSE"); return 0; } unsigned int get_power_of_two(unsigned int number) { int i; unsigned int temp1 = number, temp2; for(i = 0; temp1 > 0; i++) temp1 >>= 1; //delimo s 2 ;) temp1 = pow(2, i-1); //manji stepen temp2 = pow(2, i); //veci stepen if((temp2 - number) < (number - temp1)) //ako je blize vecem stepenu dvojke return temp2; //vrati veci stepen else return temp1; //vrati manji stepen } Kod:
unsigned int get_power_of_two(unsigned int number) { int i; for(i = 0; number > 0; i++) number >>= 1; //delimo s 2 ;) return pow(2, i); } Je l' dovoljno kratak ?... i onda se ljudi čude kako su današnje igre tako loše optimizovane. Daleko ste vi od OpenGL-a, ima još mnogo matematike da ljuštite . Ne da je matematika važna za programiranje nego programiranje jeste matematika jer su algoritmi i funkcije u stvari matematički koncepti... i sve vam to kaže čovek koji ima 6. iz matematike 2 . Poslednja ispravka: bvitnik (5.3.2008 u 20:19) |
Sledeći korisnik se zahvaljuje korisniku bvitnik na korisnoj poruci: | ||
Stevvan (5.3.2008) |
5.3.2008, 20:09 | #4 |
Veteran
|
Re: Dobijanje broja koji je stepen od 2
LOL, bvitnik bas sam na taj nacin danas pomislio u skoli, stim sto bih ja pisao number/=2 U sustini ovo se ne poziva tako cesto, mada mi je ovo moje delovalo dosta "ruzno" s obzirom da sam znao da nesto bolje postoji, mada se nikad nisam nesto posebno upustao u tu pricu sa bitovima
E da: Izvinjavam se sto sam se pogresno izrazio: Trebao mi je prvi veci broj |
5.3.2008, 20:27 | #5 |
Starosedelac
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.304
Zahvalnice: 65
Zahvaljeno 438 puta na 328 poruka
|
Re: Dobijanje broja koji je stepen od 2
Evo ti sad zadatak. Druga verzija funkcije ima jedan nedostatak (sudeći po tvojoj definiciji zadatka). Nađi ga!
|
5.3.2008, 20:55 | #6 |
Veteran
|
Re: Dobijanje broja koji je stepen od 2
He he he, to sam odma odradio, ako si mislio za "bug" u slucaju da se unese broj koji je stepen od 2. kazem ti mislio sam u skoli
Kod:
unsigned int get_power_of_two(unsigned int number) { if ((number&(number-1)) == 0) { return number; } else { int i; for(i = 0; number > 0; i++) number >>= 1; return (unsigned int)pow(2, i); } } |
5.3.2008, 20:57 | #7 |
Banned
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
|
Re: Dobijanje broja koji je stepen od 2
ja bih jednostavno:
Kod:
int veci(int broj) { int temp=1; while (temp<broj) temp=temp*2; return temp; } Poslednja ispravka: sasha vukelic (6.3.2008 u 1:47) Razlog: evo stavio sam i RETURN ;) |
Sledeći korisnik se zahvaljuje korisniku sasha vukelic na korisnoj poruci: | ||
Stevvan (5.3.2008) |
5.3.2008, 21:32 | #8 |
Veteran
|
Re: Dobijanje broja koji je stepen od 2
Zanimljiv nacin, mada mislim da ce ovo biti najoptimizovanije resenje posto mi je tvoj kod dao ideju
Kod:
unsigned int get_power_of_two(unsigned int number) { int i = 1; while (i<number) i<<=1; return i; } |
5.3.2008, 23:09 | #9 |
Banned
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
|
Re: Dobijanje broja koji je stepen od 2
o fino, vidim mislis na optimizaciju
kad ce neka igra, kolko vidim ti si buducnost ovog foruma, sto se tice tog polja |
5.3.2008, 23:17 | #10 |
Veteran
|
Re: Dobijanje broja koji je stepen od 2
Jel to bio kompliment? Bice nesto, trenutno sam na C++-u jer mi predstavlja veci izazov imam neke igre u planu, cekam pocetak aprila jer tada pocinje pythonov challenge pa nameravam da se tamo "pokazem"
|
5.3.2008, 23:23 | #11 |
Banned
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
|
Re: Dobijanje broja koji je stepen od 2
naravno da je kompliment puno srece i samo uporno
|
5.3.2008, 23:30 | #12 |
Starosedelac
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.304
Zahvalnice: 65
Zahvaljeno 438 puta na 328 poruka
|
Re: Dobijanje broja koji je stepen od 2
-> Stevvan, biće od tebe nešto , samo nastavi da
|
6.3.2008, 1:49 | #13 |
Banned
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
|
Re: Dobijanje broja koji je stepen od 2
cek, cek, ima greska:
koristio si unsigned int kao input, a temp ti je obicni int (duplo manji, jel, zbog negativnih br.)... razumijes al, aj posto ti je za teksture, vjerujem da neces ici preko 512 tako da si mogao i (unsigned) short |
6.3.2008, 9:17 | #14 |
Veteran
|
Re: Dobijanje broja koji je stepen od 2
Upravo sam ispravio i to i nasao jos jedan mali speed-up, ali ga ipak necu upotrebiti sobzirom da mi ova f-ja verovatno u jos necemu moze koristiti. Taj speed-up bi bio da se nekrece od broja 1 vec npr od 4-8, posto sumnjam da bilo ko manju teksturu od te koristi. Btw, ovo nije ni moralo da bude preterano optimizovano, sobzirom da se poziva samo onda kada se slika ucitava
|
6.3.2008, 9:25 | #15 |
Banned
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
|
Re: Dobijanje broja koji je stepen od 2
ma da ali ostavi ipak od 1 ako pozelis staviti obicnu boju na brzinu
|
Bookmarks sajtovi |
Alatke vezane za temu | |
Vrste prikaza | |
|
|
Slične teme | ||||
tema | temu započeo | forum | Odgovora | Poslednja poruka |
Život na Marsu? | Ice-Man | Brbljaonica | 149 | 26.11.2008 0:26 |
Zabranjeno za mladje od 80 godina | nighthawk | Opšta kultura | 100 | 13.10.2007 22:26 |
Šta je ADSL? Kako radi ADSL? Struktura DSL mreže..... | JovanK | Internet tehnologije | 9 | 16.7.2007 12:40 |
Računari = Ljubav, naravno. Kako zaraditi od racunarskog znanja? | vickovic zlatko | Opšta kultura | 75 | 13.7.2007 23:21 |
Uzeo bih IrDA na USB2.0 - koji je najbolji ??? | Ilic Marko | Komunikacioni uređaji i umrežavanje | 3 | 23.2.2006 19:45 |