Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Test auf Zweierpotenz

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 <
000
17.02.2011, 11:14 Uhr
ao

(Operator)


Moin zusammen.

Ich brauche einen einfachen Test, mit dem ich prüfen kann, ob ein Zahlenwert (unsigned int) eine Zweierpotenz ist oder nicht. Eingefallen ist mir folgendes:


C++:
bool isPowerOfTwo (unsigned int n)
{
    return (n | (n - 1) == n + (n - 1));
}



Erklärung: Wenn n eine Zweierpotenz ist, dann sind n und (n-1) in den Eins-Bits disjunkt, und n | (n-1) ist dasselbe wie n + (n-1). Ist n keine Zweierpotenz, dann ist das nicht der Fall.

Stimmt ihr mir zu, oder habe ich was übersehen?

BTW: Wer war das noch, der behauptet hat, Arithmetik und Bitfummelei hätten im gleichen Ausdruck nichts verloren?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.02.2011, 11:26 Uhr
ao

(Operator)


Eins fehlt noch: 0 wird irrtümlich als Zweierpotenz erkannt. Besser ist also:


C++:
bool isPowerOfTwo (unsigned n)
{    
    return (n != 0) && (n | (n-1)) == (n + (n-1));
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.02.2011, 13:24 Uhr
Tommix



Hallo,

C++:
bool isPowerOfTwo (unsigned n)
{    
    return (n != 0) && ((n & (n-1)) == 0);
}


Bzw. in Golf-C:

C++:
bool isPowerOfTwo (unsigned n)
{    
    return n&&!(n&(n-1));
}



Ich geb zu, es ist geklaut:
www.forum-3dcenter.org/vbulletin/archive/index.php/t-391761.html

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.02.2011, 13:45 Uhr
ao

(Operator)



Zitat von Tommix:
Ich geb zu, es ist geklaut:
www.forum-3dcenter.org/vbulletin/archive/index.php/t-391761.html


So ists recht. Du darfst deinen Doktor behalten.

Danke, deine Lösung ist kürzer und auch einleuchtender.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: