AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prüfen ob Potenz von 2

Ein Thema von Torpedo · begonnen am 2. Mär 2008 · letzter Beitrag vom 2. Mär 2008
Antwort Antwort
Seite 1 von 2  1 2      
Torpedo

Registriert seit: 21. Dez 2003
410 Beiträge
 
#1

Prüfen ob Potenz von 2

  Alt 2. Mär 2008, 15:28
Hallo,
wie kann ich möglichst schnell kontrollieren ob eine Zahl eine Potenz von 2 ist?
Egal ob in Delphi, Assembler oder einen anderen Sprache.

Habe mir gedacht man könnte die Anzahl der 1-Bits zählen.
Oder sowas: (bei 1 byte)

edit: ok die methode war falsch aber was gibts sonst so?
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#2

Re: Prüfen ob Potenz von 2

  Alt 2. Mär 2008, 15:31
du brauchst nur das letzte bit prüfen. ist dieses nicht gesetzt, ist es eine potenz von 2, sonst nicht.
Delphi-Quellcode:
8 4 2 1
0 0 1 0 --> 2
0 0 0 1 --> 1
0 1 1 0 --> 6
0 1 1 1 --> 7
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Prüfen ob Potenz von 2

  Alt 2. Mär 2008, 15:37
Zitat von grenzgaenger:
du brauchst nur das letzte bit prüfen. ist dieses nicht gesetzt, ist es eine potenz von 2, sonst nicht.
Veto: Was ergibt denn 2^0 ?

Er müsste - binär betrachtet - schauen ob in der Ganzzahl nur ein einzelnes Bit gesetzt ist. Also z.B. die gesamte Zahl nach rechts durchshiften und zählen wie oft das Bit 0 gesetzt ist. Wenn er auf ein zweites mal auf ein gesetztes Bit trifft, kann er aufhören.

Er müsste - mathematisch betrachtet - die Potenz berechnen zu der Basis 2, also: pot = ln(zahl) / ln(2). Wenn diese eine glatte Ganzzahl ergibt, ist es eine direkt 2'er Potenz, ansonsten nicht.

/EDIT: sirius, ja war ich im Edit gerade am ausführen...
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Prüfen ob Potenz von 2

  Alt 2. Mär 2008, 15:40
Zitat von Muetze1:
Zitat von grenzgaenger:
du brauchst nur das letzte bit prüfen. ist dieses nicht gesetzt, ist es eine potenz von 2, sonst nicht.
Veto: Was ergibt denn 2^0 ?
Deswegen muss man zählen, wie viele Bits auf 1 stehen. Ist es nur ein Bit in der gesamten Zahl, dann ist die Zahl =2^n.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Prüfen ob Potenz von 2

  Alt 2. Mär 2008, 15:49
Hi,

wir wärs mit Mathe?

Ceil(log 2 (Zahl)) = log 2 (Zahl)

(Also man muss prüfen ob log 2 (Zahl) ne Ganzzahl ist)

PS:

Folgendes funktioniert bei mir soweit ich das getestet habe:

Delphi-Quellcode:
uses Math;

function Is2erPotenz(Zahl: Integer): Boolean;
var tmp: Single;
begin
  tmp := ln(Zahl) / ln(2);
  Result := tmp = Ceil(tmp);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Is2erPotenz(StrToInt(Edit1.Text)) then
    ShowMessage('Potenz von 2!');
end;
Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#6

Re: Prüfen ob Potenz von 2

  Alt 2. Mär 2008, 15:59
Den Logaritmus zu berechnen dürfte afaik langsamer sein als ne schleife zu schreiben, die die 1 zählt.
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Prüfen ob Potenz von 2

  Alt 2. Mär 2008, 16:06
Hi,

Zitat:
Den Logaritmus zu berechnen dürfte afaik langsamer sein als ne schleife zu schreiben, die die 1 zählt.
Ok, dann darf mans sich aussuchen

Delphi-Quellcode:
function Is2erPotenz(Zahl: Integer): Boolean;
var s: Single;
begin
  s := ln(Zahl) / ln(2);
  Result := s = Ceil(s);
end;

// Is nicht optimiert aber funktioniert und dürfte wie gesagt schneller sein als das obere.
// Und man muss Math nicht einbinden.
function Is2erPotenz(Zahl: Integer): Boolean;
var i: Integer;
    tmp: Integer;
begin
  tmp := 0;
  for i:= 0 to 31 do
    if (Zahl and (1 shl i)) shr i = 1 then
      inc(tmp);
  Result := tmp = 1;
end;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Torpedo

Registriert seit: 21. Dez 2003
410 Beiträge
 
#8

Re: Prüfen ob Potenz von 2

  Alt 2. Mär 2008, 16:10
Vielen Dank für eure Hilfe
Ich werde noch eine Abfrage einbauen, die die Schleife verlässt, sobald 2 Einser gefunden wurden, damit es noch schneller ist.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Prüfen ob Potenz von 2

  Alt 2. Mär 2008, 16:11
Hallo,

versucht es einmal so:

Delphi-Quellcode:
function IsPowerOf2 (aValue: Cardinal) : Boolean;
begin
  Result := (aValue <> 0) and ((aValue and Pred(aValue)) = 0);
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: Prüfen ob Potenz von 2

  Alt 2. Mär 2008, 16:14
Zitat von Hawkeye219:
Hallo,

versucht es einmal so:

Delphi-Quellcode:
function IsPowerOf2 (aValue: Cardinal) : Boolean;
begin
  Result := (aValue = 0) or ((aValue and Pred(aValue)) = 0);
end;
Gruß Hawkeye
Funktioniert zu 99% Aber 2 hoch wie viel ist bitte 0 ?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz