Jag har gjort en rekursiv funktion för att omvandla decimal- till binär notation Exempel: Hej Så småningom blir z = 1. Hej OK En liten optimering är väl på sin plats? ~~ Tänker höll på att göra bort mig Igen :-) Jag tror inte du tänkte göra bort dig, såg lite fel, negativa binära tal representeras inte som jag har kodat och jag orkar inte fixa det nu :-/ här är min icke rekursiva versionRekursiv funktion för binär representation PROBLEM
Den fungerar men bara till 290 sedan blir det fel
Koden ser ut så här:
'Public Function BIN(z As Long)
'If z > 0 Then
' txtRuta.Text = ""
' BIN (z / 2)
' txtRuta.Text = txtRuta.Text & (z Mod 2)
'End If
'End Function
dec 290 ger 100100010
MEN 291 ger 100100101 istället för 100100011
Begriper inte varför ?
Koden borde väl funka eller inte funka- inte funka ett tag??Sv: Rekursiv funktion för binär representation PROBLEM
<code>
Public Function dec2bin(mynum As Variant) As String
Dim loopcounter As Integer
If mynum >= 2 ^ 31 Then
dec2bin = "För stor"
Exit Function
End If
Do
If (mynum And 2 ^ loopcounter) = 2 ^ loopcounter Then
dec2bin = "1" & dec2bin
Else
dec2bin = "0" & dec2bin
End If
loopcounter = loopcounter + 1
Loop Until 2 ^ loopcounter > mynum
End Function
Public Function Bin2Dec(iBin As String) As Integer
For i = 0 To Len(iBin) - 1
iTempTal = 0
iTempTal = Int(Mid(iBin, Len(iBin) - i, 1)) * 2 ^ i
iTal = iTal + iTempTal
Next i
Bin2Dec = iTal
End Function
</code>Sv: Rekursiv funktion för binär representation PROBLEM
Förbaskat smart lösning.Den var inte dålig, snacka om optimering.
Den åkte i godislådan direkt.
Option Explicit
Private Sub Command1_Click()
Label1.Caption = ""
Call BIN(291)
MsgBox "Klar"
End Sub
Private Sub BIN(ByVal z As Long)
If z > 0 Then
Call BIN (z \ 2) 'rekursivt anrop
Label1.Caption = Label1.Caption & CStr((z Mod 2))
End If
End Sub
Kan någon förklara hur det kommer sig att Subrutinen hoppar ur det
rekursiva anropet, jag förstår det inte.
/SvenSv: Rekursiv funktion för binär representation PROBLEM
z \ 2 ger bara heltalsdelen och den är då 0, z är inte längre > 0 och den "hoppar ur".
AndersSv: Rekursiv funktion för binär representation PROBLEM
Oki på detta, kom på det själv efter ett tag.
Till Sundin anledningen till att din lösning inte blev rätt är
att du gör flyttalsdivision ' BIN (z / 2)
Skall vara heltalsdivision Call BIN (z \ 2) 'rekursivt anrop.
dvs ibland blev din division x,5 då höjdes talet till närmaste högre heltal.
Så här blir det omvända hållet
Option Explicit
Private Sub Command1_Click()
Dim bitStr As String
bitStr = Text1.Text ' "100100011"
Label1.Caption = BitConvert(bitStr)
End Sub
Private Function BitConvert(ByVal bitStr As String) As String
Dim i As Long, sLen As Long, tmpStr As String
Dim bitSum As Long
tmpStr = StrReverse(bitStr)
sLen = Len(tmpStr)
For i = 1 To sLen
If Mid$(tmpStr, i, 1) = "1" Then
bitSum = bitSum + 2 ^ i
End If
BitConvert = CStr(bitSum \ 2)
Next 'i
End Function
/SvenSv: Rekursiv funktion för binär representation PROBLEM
Tack till er alla för snabba svar!
SundinSv: Rekursiv funktion för binär representation PROBLEM
<code>
Public Function dec2bin(mynum As Variant) As String
Dim loopcounter As Integer
If mynum >= 2 ^ 31 Then
dec2bin = "För stor"
Exit Function
End If
For loopcounter = 31 to 1 step -1
If cbool(mynum And 2 ^ loopcounter) Then
dec2bin = "1" & dec2bin
Else
dec2bin = "0" & dec2bin
End If
Next loopcounter
'Negativa tal hade ni missat helt
if mynum < 0 then
dec2bin = "1" & dec2bin
end if
End Function
Public Function Bin2Dec(iBin As String) As Integer
For i = 0 To Len(iBin) - 1
Bin2Dec = Bin2Dec + (Int(Mid(iBin, Len(iBin) - i, 1)) * 2 ^ i)
Next i
If left(iBin,1) = "1" and len(ibin) = 32 then
Bin2Dec = Bin2Dec * -1
End if
End Function
</code>Sv: Rekursiv funktion för binär representation PROBLEM
DSSv: Rekursiv funktion för binär representation PROBLEM
Sv: Rekursiv funktion för binär representation PROBLEM
<code>
Private Function GetBin(tal As Long)
Dim i As Long
Dim s As String
For i = 0 To 30
s = IIf((tal And (2 ^ i)), "1", "0") & s
Next
GetBin = s
End Function
</code>
//Roger
[edit]
oj , trash , såg inte din version..
[/edit]