Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 5.3.2008, 11:24   #1
Stevvan
Veteran
 
Član od: 17.12.2005.
Lokacija: Zarkovo, Beograd
Poruke: 1.114
Zahvalnice: 97
Zahvaljeno 179 puta na 104 poruka
Slanje poruke preko MSN-a korisniku Stevvan Slanje poruke preko Skypea korisniku Stevvan
Određen forumom 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);
    }
}
Ne znam jel svima jasna ovo moja "metoda", ako nije pojasnicu, ali bih voleo da vidim kako bi neko drugi to uradio, jer sam siguran da postoji optimiozvanija i kraca resenja, ali me moje neznanje sputava da ih upotrebim
Stevvan je offline   Odgovor sa citatom ove poruke
Stara 5.3.2008, 18:29   #2
MG-RAY
Starosedelac
 
Član od: 15.2.2006.
Lokacija: Midlands
Poruke: 1.523
Zahvalnice: 277
Zahvaljeno 307 puta na 207 poruka
Slanje poruke preko Skypea korisniku MG-RAY
Određen forumom 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;
}
Ko rece da matematika nije korisna ...

nadam se da ces se snaci...
MG-RAY je offline   Odgovor sa citatom ove poruke
Stara 5.3.2008, 19:40   #3
bvitnik
Starosedelac
 
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.303
Zahvalnice: 63
Zahvaljeno 438 puta na 328 poruka
Određen forumom 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
}
Ako vraća prvi veći stepen dvojke (onako kako si ti opisao), onda ide ovako (test program je isti):

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);
}
edit:

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)
bvitnik je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku bvitnik na korisnoj poruci:
Stevvan (5.3.2008)
Stara 5.3.2008, 20:09   #4
Stevvan
Veteran
 
Član od: 17.12.2005.
Lokacija: Zarkovo, Beograd
Poruke: 1.114
Zahvalnice: 97
Zahvaljeno 179 puta na 104 poruka
Slanje poruke preko MSN-a korisniku Stevvan Slanje poruke preko Skypea korisniku Stevvan
Određen forumom 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
Stevvan je offline   Odgovor sa citatom ove poruke
Stara 5.3.2008, 20:27   #5
bvitnik
Starosedelac
 
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.303
Zahvalnice: 63
Zahvaljeno 438 puta na 328 poruka
Određen forumom 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!
bvitnik je offline   Odgovor sa citatom ove poruke
Stara 5.3.2008, 20:55   #6
Stevvan
Veteran
 
Član od: 17.12.2005.
Lokacija: Zarkovo, Beograd
Poruke: 1.114
Zahvalnice: 97
Zahvaljeno 179 puta na 104 poruka
Slanje poruke preko MSN-a korisniku Stevvan Slanje poruke preko Skypea korisniku Stevvan
Određen forumom 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);
    }
}
Stevvan je offline   Odgovor sa citatom ove poruke
Stara 5.3.2008, 20:57   #7
sasha vukelic
Banned
 
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
Određen forumom 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 ;)
sasha vukelic je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku sasha vukelic na korisnoj poruci:
Stevvan (5.3.2008)
Stara 5.3.2008, 21:32   #8
Stevvan
Veteran
 
Član od: 17.12.2005.
Lokacija: Zarkovo, Beograd
Poruke: 1.114
Zahvalnice: 97
Zahvaljeno 179 puta na 104 poruka
Slanje poruke preko MSN-a korisniku Stevvan Slanje poruke preko Skypea korisniku Stevvan
Određen forumom 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;
}
Stevvan je offline   Odgovor sa citatom ove poruke
Stara 5.3.2008, 23:09   #9
sasha vukelic
Banned
 
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
Određen forumom 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
sasha vukelic je offline   Odgovor sa citatom ove poruke
Stara 5.3.2008, 23:17   #10
Stevvan
Veteran
 
Član od: 17.12.2005.
Lokacija: Zarkovo, Beograd
Poruke: 1.114
Zahvalnice: 97
Zahvaljeno 179 puta na 104 poruka
Slanje poruke preko MSN-a korisniku Stevvan Slanje poruke preko Skypea korisniku Stevvan
Određen forumom 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"
Stevvan je offline   Odgovor sa citatom ove poruke
Stara 5.3.2008, 23:23   #11
sasha vukelic
Banned
 
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
Određen forumom Re: Dobijanje broja koji je stepen od 2

naravno da je kompliment puno srece i samo uporno
sasha vukelic je offline   Odgovor sa citatom ove poruke
Stara 5.3.2008, 23:30   #12
bvitnik
Starosedelac
 
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.303
Zahvalnice: 63
Zahvaljeno 438 puta na 328 poruka
Određen forumom Re: Dobijanje broja koji je stepen od 2

-> Stevvan, biće od tebe nešto , samo nastavi da
bvitnik je offline   Odgovor sa citatom ove poruke
Stara 6.3.2008, 1:49   #13
sasha vukelic
Banned
 
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
Određen forumom 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
sasha vukelic je offline   Odgovor sa citatom ove poruke
Stara 6.3.2008, 9:17   #14
Stevvan
Veteran
 
Član od: 17.12.2005.
Lokacija: Zarkovo, Beograd
Poruke: 1.114
Zahvalnice: 97
Zahvaljeno 179 puta na 104 poruka
Slanje poruke preko MSN-a korisniku Stevvan Slanje poruke preko Skypea korisniku Stevvan
Određen forumom 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
Stevvan je offline   Odgovor sa citatom ove poruke
Stara 6.3.2008, 9:25   #15
sasha vukelic
Banned
 
Član od: 20.12.2005.
Lokacija: banjaluka
Poruke: 3.220
Zahvalnice: 278
Zahvaljeno 363 puta na 216 poruka
Određen forumom Re: Dobijanje broja koji je stepen od 2

ma da ali ostavi ipak od 1 ako pozelis staviti obicnu boju na brzinu
sasha vukelic je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


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


Sva vremena su po Griniču +2 h. Sada je 11:48.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com