Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje
Uputstvo Članstvo Kalendar Današnje poruke Pretraži

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)
Odgovor

Bookmarks sajtovi


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 12:40.


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