![]() |
![]() |
|
|||||||
| Programiranje Programski jezici, tehnike, alatke... |
![]() |
|
|
Alatke vezane za temu | Vrste prikaza |
|
|
#1 |
|
Veteran
|
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);
}
}
|
|
|
|
|
|
#2 |
|
Starosedelac
|
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... |
|
|
|
|
|
#3 |
|
Starosedelac
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.308
Zahvalnice: 67
Zahvaljeno 440 puta na 330 poruka
|
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) | ||
|
|
#4 |
|
Veteran
|
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 |
|
Starosedelac
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.308
Zahvalnice: 67
Zahvaljeno 440 puta na 330 poruka
|
Evo ti sad zadatak. Druga verzija funkcije ima jedan nedostatak (sudeći po tvojoj definiciji zadatka). Nađi ga!
|
|
|
|
|
|
#6 |
|
Veteran
|
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);
}
}
|
|
|
|
|
|
#7 |
|
Banned
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
|
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) | ||
|
|
#8 |
|
Veteran
|
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;
}
|
|
|
|
|
|
#9 |
|
Banned
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
|
o fino, vidim mislis na optimizaciju
![]() kad ce neka igra, kolko vidim ti si buducnost ovog foruma, sto se tice tog polja
|
|
|
|
|
|
#10 |
|
Veteran
|
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"
|
|
|
|
|
|
#11 |
|
Banned
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
|
naravno da je kompliment
puno srece i samo uporno
|
|
|
|
|
|
#12 |
|
Starosedelac
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.308
Zahvalnice: 67
Zahvaljeno 440 puta na 330 poruka
|
-> Stevvan, biće od tebe nešto
, samo nastavi da |
|
|
|
|
|
#13 |
|
Banned
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
|
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
|
|
|
|
|
|
#14 |
|
Veteran
|
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
|
|
|
|
|
|
#15 |
|
Banned
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
|
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 |