Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
796to800
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
796to800
796to800
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Bits einer Zahl ermitteln, DezInBin in VBA

Bits einer Zahl ermitteln, DezInBin in VBA
29.08.2006 16:43:28
Reinhard
Hallo Wissende,
wie kann ich die Bitanzahl einer Dezimalzahl (1 - 512) am schnellsten ermitteln?
Brauche ich dazu die Binärzahl der Dezimalzahl und muss ich zur Umwandlung von Dezimal in Binär selbst eine Funktion schreiben oder wie heißt die in VBA, finde da nichts.
Und MsgBox Application.WorksheetFunction.dezinbin(10) geht ja nicht.
Danke ^ Gruß
Reinhard

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
=GANZZAHL(LOG(A1;2))+1 oT
29.08.2006 16:49:30
ingoG
.
VBA-Lösung
29.08.2006 17:13:07
ingoG
Hallo Reinhard,
in VBA kannst Du das so umsetzen...
Gruß Ingo
PS eine Rückmeldung wäre nett...

Sub aaa()
MsgBox Int(Application.WorksheetFunction.Log(512, 2)) + 1
End Sub

AW: VBA-Lösung
29.08.2006 17:32:16
Reinhard
Hi Ingo,
ich experimentiere herum was am schnellsten ist.
Jetzt kam mir gerade der Gedanke, einmalig eine Tabelle für die Zahlen 1 bis 512 zu erstellen und nebendran die Anzahl der Bits zu schreiben. Dann kann ich da schnell mit Vlookup zugreifen.
Gruß
Reinhard
AW: VBA-Lösung
29.08.2006 17:45:06
ingoG
Hallo Reinhard,
vlookup() ist nicht schnell
dann bau dir lieber ein array und besetze die werte entsprechend
Gruß Ingo
PS eine Rückmeldung wäre nett...
Option Explicit

Sub aaa()
Dim binLaenge(1 To 512) As Integer, ii As Integer
For ii = 1 To 512
binLaenge(ii) = Int(Application.WorksheetFunction.Log(ii, 2)) + 1
Next ii
MsgBox binLaenge(512)
End Sub

Anzeige
AW: Bits einer Zahl ermitteln, DezInBin in VBA
29.08.2006 16:49:49
c0bRa
hio...
brauchst du nur die Bitanzahl der Zahl?
wenn ja:
=AUFRUNDEN(LOG(A1+1;2);0)
Um die Funktionen DEZINBIN etc. zu nutzen, musst du das Analyse Add-In unter Extras => Add-Ins aktivieren.
Rückmeldung nicht vergessen...
c0bRa
I hacked 127.0.0.1
AW: Bits einer Zahl ermitteln, DezInBin in VBA
29.08.2006 17:20:22
Reinhard
Danke euch beiden,
aber ich suche VBA-Lösungen wo ich aus Performancegründen auf eine Schleife in der Funktion verzichten kann. Also was Schnelles.
Aber okay, werde mal eure Lösungen prüfen ob sie mit Application.Worksheetfunction schneller als meine Funktion sind.
Inzwischen habe ich mir diese Funktion erstellt:
Function EinBit(ByVal Zahl As Integer) As Boolean
Dim n As Byte
For n = 0 To 8
If Zahl = 2 ^ n Then
EinBit = True
Exit For
End If
Next n
End Function

Gruß
Reinhard
Anzeige
AW: Bits einer Zahl ermitteln, DezInBin in VBA
29.08.2006 17:35:49
EtoPHG
Hallo Reinhard,
Wieso Worksheet function ?
VBA so:
NrOfBits = Int(Log(WholeNumber) / Log(2) + 1)
Gruss Hansueli
AW: Bits einer Zahl ermitteln, DezInBin in VBA
29.08.2006 18:44:49
Reinhard
Hi Hansueli,

Sub tt()
Dim NrOfBits
NrOfBits = Int(Log(64) / Log(2) + 1)
MsgBox NrOfBits
End Sub

klappt nicht, kommt 7 heraus, aber lass ma, ich nehm die Arraylösung von Ingo, scheinbar das Allerschnellste was geht.
Danke an Alle
Gruß
Reinhard
AW: Bits einer Zahl ermitteln, DezInBin in VBA
29.08.2006 19:06:28
EtoPHG
Hallo Reinhard,
Ich glaub^s nicht, aber Du hast recht.
Probier mal:

Sub tt()
Dim NrOfBits As Double
NrOfBits = Int(Log(64#) / Log(2#) + 1#)
MsgBox NrOfBits
MsgBox Int(Log(64#) / Log(2#) + 1#)
End Sub

Was zum Teufel soll das ?
Anzeige
die 7 bleibt unerreicht :-)
29.08.2006 19:19:43
Reinhard
Tja nu, k.A., irgendwas mit Typumwandlungen...
Sub ttt()
Dim NrOfBits As Double
NrOfBits = Int(Log(64#) / Log(2#) + 1#)   '                Anzeige:
MsgBox NrOfBits                           '                    7
MsgBox Int(Log(64#) / Log(2#) + 1#)       '                    6
MsgBox CDbl(Int(Log(64#) / Log(2#) + 1#)) '                    6
MsgBox Int(Log(64#) / CDbl(Log(2#) + 1#)) '                    2
MsgBox Int(Log(64#) / CDbl(Log(2#)) + 1#) '                    6
MsgBox Int(CDbl(Log(64#)) / CDbl(Log(2#)) + 1#) '              6
MsgBox CDbl(Int(CDbl(Log(64#))) / CDbl(Log(2#)) + 1#) '        6,77...
MsgBox CDbl(Int(CDbl(Log(64#))) / CDbl(Log(2#)) + CDbl(1#)) '  6,77...
MsgBox Int(CDbl(Log(64#)) / CDbl(Log(2#)) + CDbl(1#)) '        6
End Sub

Gruß
Reinhard
Anzeige
AW: doch jetzt ist's plötzlich 6
29.08.2006 19:58:11
EtoPHG
Hallo Reinhard,
Ich hab schon mal irgendwo einen Thread bezgl. der Genauigkeit von Excel beantwortet. Eigentlicht hätte ich es wissen müssen.
Antwort Excel rechnet mit 15 signifikanten Stellen.
Also die Formel
NrOfBits = Int(Log(WholeNumber) / Log(2#) + 0.99999999999999)
haut hin. Mach aber ja KEINE 9 mehr als hier angegeben ist ;-)
Gruss Hansueli
FALSCH -RICHTIG-FALSCH-RICHTIG
31.08.2006 09:19:01
EtoPHG
Hallo Reinhard,
Nochmals zu diesem Thema:
Wieviel Bits belegt die Zahl 64 ? 7 SIEBEN !!! und nicht 6 !!!!
Hier ist nun die ultimative VBA Formel:
getNrOfBits = Int(Log(Abs(IIf(thisNumber = 0, 1, thisNumber))) / Log(2) + 1)
Gruss Hansueli
Anzeige
mea culpa :-(
31.08.2006 09:57:39
Reinhard
Hallo Hansueli,
es tut mir leid für Alle die sich für mich Gedanken machten. Leider fällt mir erst jetzt auf dass die Frage wohl falsch gestellt war.
Mit ...wie kann ich die Bitanzahl einer Dezimalzahl (1 - 512) am schnellsten ermitteln?...
wollte ich ermitteln wieviele Bits "gesetzt" sind, nicht die Bitbreite. Da ich inzwischen eine Arraylösung
(ein in einer Tabelle aufgelistetes Array(512) hat in den Indexen 1,2,4,8,16,... den Wert 1/True bzw. die anderen Indices den Wert 0/False oder die Anzahl gesetzter Bits)
benutze kann ich sehr schnell feststellen ob die Zahl nur ein Bit besitzt. Von daher hatte ich die Formellösungen nicht weiterverfolgt um herauszufinden wie man auf "7" bei der DezZahl 64 kommt.
Deine Formel schaue ich mir trotzdem gerne an.
Gruß
Reinhard
Anzeige

312 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige