Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Rausfinden ob eine Zahl 2^x ist
wollmich
myCSharp.de - Member

Avatar #avatar-3418.jpg


Dabei seit:
Beiträge: 178
Herkunft: Bern (CH)

Themenstarter:

Rausfinden ob eine Zahl 2^x ist

beantworten | zitieren | melden

Guten Tag,

ich möchte möglichst effizient rausfinden ob eine Zahl 2^x ist.

Mein Ansatz:


public static boolean Test(int value)
{
    double temp1 = System.Math.Log(n, 2);
    double temp2 = System.Math.Floor(temp1);
    return (temp1 == temp2);
}

Geht das nicht einfacher? Mit schieben oder so? Was meint ihr?

Gruss Wollmich
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Überleg mal wie eine solche Zahl in Binär-Darstellung aussieht. Mit dem Schieben bist du schon auf dem richtigen Dampfer....
private Nachricht | Beiträge des Benutzers
Torley
myCSharp.de - Member



Dabei seit:
Beiträge: 109

beantworten | zitieren | melden

Hi,
zuspät, poste aber trotzdem
mein erster gedanke war die zahl in eine binärzahl umzuwandeln und die 1 en zählen!
wenns nur eine ist (ausgenommen wenss die ganz rechts ist), ists ne hochtzahl von 2;

Torley
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Torley am .
private Nachricht | Beiträge des Benutzers
wollmich
myCSharp.de - Member

Avatar #avatar-3418.jpg


Dabei seit:
Beiträge: 178
Herkunft: Bern (CH)

Themenstarter:

beantworten | zitieren | melden

Danke für die schnelle Antwort.

Ist mir klar das bei einer solchen Zahl in der binär Darstellung nur eine Ziffer eine '1' ist und der Rest alles '0' sein muss.

Aber wie kann ich das clever vergleichen. 32 mal schieben (in einem Loop) und vergleichen ob nur ein 1 vorkommt? Ist mir fast peinlich aber ich denke das geht doch noch einfacher.

Anmerkung am Rande: Die Zahl muss nicht durch 2 teilbar sein sondern die Potenz davon.

Gruss Wollmich
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von wollmich am .
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Zitat von wollmich
Ist mir fast peinlich aber ich denke das geht doch noch einfacher.

Denk nicht. Ist zumindest eine sehr schnelle Variante. Eine Schleife mit ein paar Shifts und einem Vergleich geht ratzfatz.

Zitat
Anmerkung am Rande: Die Zahl muss nicht durch 2 teilbar sein sondern die Potenz davon.

Durch zwei teilbar heisst, dass das niederwertigste Bit 0 ist....
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1.361
Herkunft: Berlin

beantworten | zitieren | melden

Hi,


public static Boolean isPowerOf2(int v)
{
   return (v & (v - 1))==0 && (v != 0);
}

beste Grüße
zommi

PS: Idee kommt von Bit Twiddling Hacks
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Zitat von zommi


public static Boolean isPowerOf2(int v)
{
   return (v & (v - 1))==0 && (v != 0);
}

Wow, der ist gut.
private Nachricht | Beiträge des Benutzers
wollmich
myCSharp.de - Member

Avatar #avatar-3418.jpg


Dabei seit:
Beiträge: 178
Herkunft: Bern (CH)

Themenstarter:

beantworten | zitieren | melden

Vielen Dank für die schnelle Lösung und schnellen Antworten.

Gruss Wollmich
private Nachricht | Beiträge des Benutzers
xxxprod
myCSharp.de - Experte

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

So vielleicht?^^


String binaryString = Convert.ToString(value, 2);
bool result = binaryString.IndexOf('1') == binaryString.LastIndexOf('1');

Lg XXX
private Nachricht | Beiträge des Benutzers
pohlmann
myCSharp.de - Member



Dabei seit:
Beiträge: 67
Herkunft: Willingen

beantworten | zitieren | melden

Lustige Idee.
Aber was mich daran stört, ist das man einen Int erst in einen String konvertieren muss obwohl das auf Bit-Ebene - wie man sehen kann - viel einfacher und schneller funktioniert.

Damit wollte ich eigentlich nur sagen, das xxxprod vielleicht mal seinen Code durchsuchen sollte um solche Stellen zu verbessern (falls er es denn in seinen Programmen so geschrieben hat).
Religionskriege sind Konflikte zwischen erwachsenen Menschen, bei denen es darum geht, wer den cooleren, imaginaeren Freund hat
private Nachricht | Beiträge des Benutzers
wollmich
myCSharp.de - Member

Avatar #avatar-3418.jpg


Dabei seit:
Beiträge: 178
Herkunft: Bern (CH)

Themenstarter:

beantworten | zitieren | melden

Mir gefällt die Lösung von zommi am besten.

1 Subtraktion
2 Logische Verknüpfungen
2 Vergleiche

Das ist viel schneller als eine Umwandlung in einen String.

Für mich ist das Problem gelöst, DANKE.

Gruss Wollmich
private Nachricht | Beiträge des Benutzers
0815Coder
myCSharp.de - Member



Dabei seit:
Beiträge: 767

beantworten | zitieren | melden

nicht so schnell wie die bit-lösung, dafür mathematisch:


int x = 16;

double tmp = Math.Log(x, 2);
bool isPowerOf2 = (int)tmp == tmp;
loop:
btst #6,$bfe001
bne.s loop
rts
private Nachricht | Beiträge des Benutzers
wollmich
myCSharp.de - Member

Avatar #avatar-3418.jpg


Dabei seit:
Beiträge: 178
Herkunft: Bern (CH)

Themenstarter:

beantworten | zitieren | melden

Danke, aber das war doch meine Ursprungslösung ?(
private Nachricht | Beiträge des Benutzers
0815Coder
myCSharp.de - Member



Dabei seit:
Beiträge: 767

beantworten | zitieren | melden

ja

aber der gute 0815coder hat wieder mal beim lesen nur den ersten teil gelesen und dann rest überflogen... bzw is drübergestolpert.

is natürlich so gut wie ident.
loop:
btst #6,$bfe001
bne.s loop
rts
private Nachricht | Beiträge des Benutzers
Xynratron
myCSharp.de - Member



Dabei seit:
Beiträge: 1.177

beantworten | zitieren | melden

[offtopic]huhu
Zitat von pohlmann
Lustige Idee.
Aber was mich daran stört, ist das man einen Int erst in einen String konvertieren muss [..] das xxxprod vielleicht mal seinen Code durchsuchen sollte um solche Stellen zu verbessern

geh eher davon aus, dass das nur eine nicht ernstgemeinte zusätzliche Lösung ist, um den Alltag etwas amüsanter zu gestalten und dem Leser ein Lächeln zu entlocken^^

:-)

Xynratron
[/offtopic]
Herr, schmeiss Hirn vom Himmel - Autsch!
Zitat von herbivore
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
private Nachricht | Beiträge des Benutzers