Frage

Angesichts des Wikipedia-Artikels über Radix-Punkt, wie würde man das binäre Äquivalent von 10,1 oder das hexadezimale Äquivalent von 17,17 berechnen?Was ist für Ersteres das binäre Äquivalent eines Zehntels?Für Letzteres ist die Hex-Darstellung von 17/100?

Ich suche mehr nach einem Algorithmus als nach Lösungen für nur diese beiden Beispiele.

War es hilfreich?

Lösung

Um die Dezimalzahl 10.1 in eine Binärzahl umzuwandeln, trennen Sie die ganzzahligen und gebrochenen Teile und konvertieren Sie sie jeweils separat.

Um den ganzzahligen Teil umzuwandeln, verwenden Sie eine wiederholte ganzzahlige Division durch 2 und schreiben Sie dann die Reste in umgekehrter Reihenfolge:

10/2 = 5 Rest 0

5/2 = 2 Rest 1

2/2 = 1 Rest 0

1/2 = 0 Rest 1

Antwort:1010

Um den Bruchteil umzuwandeln, verwenden Sie eine wiederholte Multiplikation mit 2 und subtrahieren bei jedem Schritt den ganzzahligen Teil.Die ganzzahligen Teile stellen in der Reihenfolge ihrer Erzeugung Ihre Binärzahl dar:

0.1 * 2 = 0.2

0.2 * 2 = 0.4

0.4 * 2 = 0.8

0.8 * 2 = 1.6

0.6 * 2 = 1.2

0.2 * 2 = 0.4

0.4 * 2 = 0.8

...(Zyklus wiederholt sich für immer)

Dezimal 0,1 ist also binär 0,000110011001100 ...

(Eine ausführlichere Erklärung finden Sie in den Routinen dec2bin_i() und dec2bin_f() in meinem Artikel http://www.exploringbinary.com/base-conversion-in-php-using-bcmath/ .)

Für Hexadezimalzahlen verwenden Sie das gleiche Verfahren, außer mit einem Divisor/Multiplikator von 16 statt 2.Reste und ganzzahlige Teile größer als 9 müssen direkt in Hexadezimalzahlen umgewandelt werden:10 wird zu A, 11 wird zu B, ..., 15 wird zu F.

Andere Tipps

A Endnummer (eine Zahl, das durch eine endliche Anzahl von Ziffern dargestellt werden kann), n 1 in der Basis b 1 , ein nicht-Endnummer bis Ende Mai in einer anderen Basis b 2 . Umgekehrt kann ein nicht-Endnummer in einer Basis b 1 ausfallen kann eine Endnummer in Basis B sein 2 .

Die Zahl 0,1 10 , wenn auf binär umgewandelt ist ein nicht-Endnummer, wie 0,17 10 , wenn in eine hexadezimalen Zahl umgewandelt. Aber die Endnummer 0,1 3 in der Basis 3, wenn umgewandelt zur Basis 10 ist die nicht endet, ich wiederholende Nummer 0 (3) 10 (was bedeutet, dass die Zahl 3 Wiederholungen ). In ähnlicher Weise der Umwandlung 0,1 10 , um binäre und 0,17 10 , um hexadezimal, ein Enden mit dem nicht-Abschluss oben, ich wiederholende Zahlen 0,0 (0011) 2 und 0,2 (B851E) 16

Aus diesem Grund, wenn eine solche Anzahl von einer Basis in eine andere umzuwandeln, können Sie sich die Nummer zu nähern zu finden, die anstelle einer Darstellung, die ganz genau ist.

Der Algorithmus ist recht einfach, aber in der Praxis können Sie eine Menge von Verbesserungen sowohl mit Lookup-Tabellen und Protokollen zu tun, es zu beschleunigen. Aber für die Basis-Algorithmus, können Sie so etwas wie dies versuchen:

shift=0;

while v>=base,  v=v/base, shift=shift+1;  

Next digit: 
if v<1.0 && shift==0, output the decimal point
else 
   D=floor(v)
   output D
   v=v-D
v=v*base
shift = shift-1
if (v==0) exit;
goto Next Digit

Sie auch einen Test in dort setzen können für längeren Druck nach N Stellen zu stoppen Dezimalstellen zu wiederholen.

Das 'binäres Äquivalent' von einem Zehntel ist die eine Hälfte, das heißt, anstelle von 1/10 ^ 1, es ist 1/2 ^ 1.

Jede Ziffer steht für eine Zweierpotenz. Die Ziffern hinter dem Radix Punkt sind die gleichen, es ist nur, dass sie 1 über die Zweierpotenz darstellen:

 8 4 2 1 . 1/2 1/4 1/8 1/16 

Also für 10.1, müssen Sie offensichtlich eine ‚8‘ und eine ‚2‘, um den 10 Teil zu machen. 1/2 (0.5) ist zu viel, 1/4 (0,25) zu viel ist, 1/8 (0,125) zu viel ist. Wir brauchen 1/16 (0,0625), was uns mit 0,0375 verlassen. 1/32 ist 0,03125, also können wir das auch nehmen. Bisher haben wir:

 8 4 2 1 . 1/2 1/4 1/8 1/16 1/32
 1 0 1 0    0   0   0   1     1

Mit einem Fehler von 0,00625. 1/64 (0,015625) und 1/128 (0,0078125) beide zu viel, 1/256 (0,00390625) funktioniert:

 8 4 2 1 . 1/2 1/4 1/8 1/16 1/32 1/64 1/128 1/256
 1 0 1 0    0   0   0   1     1    0   0     1

Mit einem Fehler von 0,00234375.

Die 0,1 kann nicht binär ausgedrückt genau werden (wie 1/3 kann nicht in dezimal ausgedrückt genau sein). Je nachdem, wo Sie Ihre radix setzen, müssen Sie schließlich stoppen, wahrscheinlich rund, und den Fehler akzeptieren.

Bevor ich mit dieser im Lichte meiner GMP Bibliothek twiddle, hier, wo ich zu versuchen, bekam Rick Regan PHP-Code generic für jede Basis von 2 bis 36.

zu machen
Function dec2base_f(ByVal ddecimal As Double, ByVal nBase As Long, ByVal dscale As Long) As String
    Const BASES = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 'up to base 36
    Dim digitCount As Long
    Dim wholeNumber As Double
    Dim digit As String * 1
    digitCount = 0
    dscale = max(dscale, Len(CStr(ddecimal)) - Len("0."))
    Dim baseary_f As String
    baseary_f = "0."
    Do While ddecimal > 0 And digitCount < dscale
        ddecimal = ddecimal * nBase
        digit = Mid$(BASES, Fix(ddecimal) + 1)
        baseary_f = baseary_f & digit '"1"
        ddecimal = ddecimal - Fix(ddecimal)
        digitCount = digitCount + 1
    Loop
    dec2base_f = baseary_f
End Function

Function base2dec_f(ByVal baseary_f As String, nBase As Double) As Double
    Const BASES As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Dim decimal_f As Double
    Dim i As Long
    Dim c As Long
    For i = Len(baseary_f) To Len("0.") + 1 Step -1
        c = InStr(BASES, Mid$(baseary_f, i, 1)) - 1
        decimal_f = decimal_f + c
        decimal_f = decimal_f / nBase
    Next
    base2dec_f = decimal_f
End Function

Debug.Print base2dec_f(dec2base_f(0.09, 2, 200), 2) --> 0.09
Debug.Print base2dec_f(dec2base_f(0.09, 8, 200), 8) --> 0.09
Debug.Print base2dec_f(dec2base_f(0.09, 16, 200), 16) --> 0.09
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top