Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » powerOfTwo

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
05.07.2004, 13:50 Uhr
0xdeadbeef
Gott
(Operator)


Hm.

C++:
unsigned f(unsigned x) {
  unsigned count = 0, pos = 0, max_pos = 0;
  for(; pos < sizeof(unsigned) * 8; ++pos)
    if(x >> pos & 1) {
      max_pos = pos;
      ++count;
    }
  return max_pos - (count == 1) + 1;
}


oder auch:

C++:
unsigned f(unsigned x) {
  unsigned count = 0, pos = 0, max_pos = 0, tmp = x;
  for(; tmp && pos < sizeof(unsigned) * 8; ++pos)
    if((tmp = x >> pos) & 1) {
      max_pos = pos;
      ++count;
    }
  return max_pos - (count == 1) + 1;
}


Ich hab grad keinen bench drüber laufen lassen. Was soll eigentlich bei der Eingabe 0 rauskommen?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 05.07.2004 um 13:54 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
05.07.2004, 13:58 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


eine übelste beschimpfung des users
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
05.07.2004, 14:05 Uhr
0xdeadbeef
Gott
(Operator)



C++:
int f(unsigned x) {
  unsigned count = 0, pos = 0, max_pos = 0, tmp = x;

  if(x == 0) {
    puts("Du verdammter, vom Teufel besessener Windoze-User!!");
    return -1;
  }

  for(; tmp && pos < sizeof(unsigned) * 8; ++pos)
    if((tmp = x >> pos) & 1) {
      max_pos = pos;
      ++count;
    }
  return max_pos - (count == 1) + 1;
}



Bearbeitung:

Jupp, da hat Windalf mal nen guten Vorschlag gemacht. Kommt ja selten genug vor...


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 05.07.2004 um 14:10 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
05.07.2004, 14:06 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hmm ich bin ja erstaunt das du nicht Du verdammter Windowsuser geschrieben hast...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
05.07.2004, 14:11 Uhr
0xdeadbeef
Gott
(Operator)


Besser so?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
05.07.2004, 14:22 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Nein, du armer indoktrinierter Irrer
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
05.07.2004, 23:30 Uhr
(un)wissender
Niveauwart


Tolle Beteiligung, wenn ich zum Sieger krönen soll, weiß ich nicht, Windalfs Lösung ist portabel und schön, aber aos Lösung ist sehr schnell, Beefys ist ein Mittelding aus beiden.
Habt alle gewonnen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
06.07.2004, 12:41 Uhr
0xdeadbeef
Gott
(Operator)


Hast du die Dinger mal gegeneinander gebencht? Ich will wissen, wie viel langsamer meine Lösung als aos ist - im Endeffekt arbeite ich ja nach so ziemlich dem gleichen Prinzip, nur dass ich direkt auf der Zahl aufsetze...


Bearbeitung:

OK, ich habs mal selbst gemacht. Hier die Ergebnisse mit

C++:
int main() {
  unsigned i;
  for(i = 1; i < 100000000L; ++i) f(i);
  return 0;
}


aos Lösung:

shell:

real    0m15.680s
user    0m15.061s
sys     0m0.017s


Meine erste (ohne tmp):

shell:

real    0m24.044s
user    0m23.074s
sys     0m0.057s


meine zweite:

shell:

real    0m25.451s
user    0m24.513s
sys     0m0.047s


Hm. Wohl doch ein ganz schöner Unterschied.


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 06.07.2004 um 12:50 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
09.07.2004, 20:23 Uhr
NemoEimi



Huhu,

ich habe noch eins:


C++:
unsigned ceil_ld(unsigned n) {
  unsigned z = 1; bool twopow = true;
  while(n ^ 1) {
    if (n&1) twopow = false;
    n = n >> 1;
    z++;
    }
  if (twopow) z--;
  return(z);
  }



Auf meinem Rechner ist das ungefähr 2.4-mal schneller als beefys Lösung.


Zitat:
Edit: unglücklicherweise ist dieses Ergebnis aber wohl ein Artefakt bedingt dadurch, daß der Compiler den Aufruf meiner Funktion in beefys main anscheinend wegoptimiert leider -- seufz


Grüße,
Nemo

Dieser Post wurde am 09.07.2004 um 20:52 Uhr von NemoEimi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
09.07.2004, 20:26 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Auf meinem Rechner ist das ungefähr 2.4-mal schneller als beefys Lösung.


hehe
und beefy lässt du das auf dir sitzen?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: